Numpy: Следует использовать newaxis или None?

91

В numpy можно использовать объект newaxis в синтаксисе нарезки для создания оси длины один, например:

import numpy as np
print np.zeros((3,5))[:,np.newaxis,:].shape
# shape will be (3,1,5)

В документации указано, что можно использовать Noneвместо newaxis, эффект точно такой же.

Есть ли причина выбирать одно вместо другого? Есть ли какие-то общие предпочтения или руководство по стилю? Мне newaxisкажется, что это более популярно, вероятно, потому, что оно более явное. Так есть ли причина, по которой Noneэто разрешено?

nikow
источник

Ответы:

103

Noneразрешено, потому что numpy.newaxisэто просто псевдоним для None.

In [1]: import numpy

In [2]: numpy.newaxis is None
Out[2]: True

Вероятно, авторы выбрали его, потому что им нужна была удобная константа, и она Noneбыла доступна.

А почему вы должны предпочесть newaxisболее None: в основном это потому , что это более явно, а отчасти потому , что когда - нибудь numpyавторы могли бы изменить его на что - то другое , чем None. (Они не планируют и, вероятно, не будут этого делать, но нет веских причин отдавать предпочтение None.)

AFoglia
источник
Спасибо, я не заметил, что np.newaxis на самом деле None. Тогда я пойду с новой осью.
nikow,
7
На самом деле они говорят, что вы можете использовать None, поэтому они не могут его изменить сейчас: «Объект newaxis может использоваться в базовом синтаксисе срезов, описанном выше. None также может использоваться вместо newaxis».
endolith
5
Также, если вы работаете с людьми, незнакомыми с деталями индексирования numpy, они, кажется, сходят с ума, когда видят разыменованные массивы с помощью «None»
Питер
1
Одно место , когда Noneэто лучше оптимизация скорости выполнения, он может дать очень крошечное преимущество по времени. Но обычно вам следует предпочесть np.newaxis.
годайго 05
2
Почему они просто не использовали newaxis = object()(или эквивалент уровня C), я не понимаю ... использование Noneвесьма подвержено ошибкам. У меня была функция с ошибкой (голая, returnкоторая должна была возвращать логический массив), и я начал получать ошибки из-за несоответствия формы. Мне потребовалось время, чтобы понять, что индексирование с помощью Noneне просто вызывает расширение IndexError. Если бы они использовали «новое» значение дозорного, я бы избежал 30 минут попыток разобраться в ошибке ...
Джакомо Альцетта