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це дозволено?

Відповіді:


103

Noneдозволено, оскільки numpy.newaxisце просто псевдонім для None.

In [1]: import numpy

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

Автори, ймовірно, обрали його, тому що їм потрібна була зручна константа і Noneбула доступна.

Що стосується того, чому вам слід віддавати перевагу newaxisнад None: в основному це тому, що це більш чітко, і частково тому, що колись numpyавтори можуть змінити це на щось інше, ніж None. (Вони не планують і, можливо, не будуть, але немає вагомих причин, щоб віддавати перевагу None.)


Дякую, я не помітив, що np.newaxis насправді немає. Тоді я піду з новою віссю.
nikow

7
Вони насправді кажуть, що ви можете використовувати None, тому вони не можуть це змінити зараз: "Об'єкт newaxis може використовуватися в базовому синтаксисі нарізки, обговореному вище. Жоден також не може використовуватися замість newaxis."
ендоліт

5
Крім того, якщо ви працюєте з людьми, незнайомими з деталями індексації numpy, вони, схоже, збожеволіли, коли побачили масиви, що позначаються "None"
Петро,

1
Одне місце, коли Noneкраще, це оптимізація швидкості виконання, це може дати дуже незначну вигоду в часі. Але зазвичай вам слід віддати перевагу np.newaxis.
godaygo

2
Чому вони просто не використовували newaxis = object()(або еквівалент рівня С) мені не під силу ... використання Noneдосить схильне до помилок. У мене була функція з помилкою (голою, returnяка повинна була повернути логічний масив), і я почав отримувати помилки через невідповідність фігури. Мені знадобився час, щоб зрозуміти, що індексація за допомогою Noneне просто піднімає IndexError. Якби вони використовували "свіже" значення вартового, я б уникнув 30 хвилин спроб зрозуміти помилку ...
Джакомо Альзетта
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.