Гочась, где Numpy отличается от прямого питона? - PullRequest
26 голосов
/ 24 августа 2009

Люди,

есть ли коллекция ошибок, где Numpy отличается от python, Очки, которые озадачили и стоили времени?

"Ужас того момента я никогда не забудь! "
"Вы будете, однако," сказала Королева, "если вы этого не сделаете сделать меморандум об этом. "

Например, NaN всегда неприятны, где угодно. Если вы можете объяснить это, не выполняя, поставьте себе точку -

from numpy import array, NaN, isnan

pynan = float("nan")
print pynan is pynan, pynan is NaN, NaN is NaN
a = (0, pynan)
print a, a[1] is pynan, any([aa is pynan for aa in a])

a = array(( 0, NaN ))
print a, a[1] is NaN, isnan( a[1] )

(Я не сбиваю с ног, много хорошей работы там, просто думаю, что FAQ или Wiki о гучах будут полезны.)

Редактировать: Я надеялся собрать полдюжины ошибок (сюрпризов для людей, изучающих Numpy).
Тогда, если есть общие ошибки или, что лучше, общие объяснения, мы могли бы поговорить о добавлении их в сообщество вики (где?) Не похоже, что у нас достаточно пока.

Ответы [ 15 ]

2 голосов
/ 28 января 2015

Сюрприз с назначением *= в сочетании с numpy.array:

>>> from numpy import array

>>> a = array([1, 2, 3])
>>> a *= 1.1  
>>> print(a) 
[1 2 3]  # not quite what we expect or would like to see

>>> print(a.dtype)
int64  # and this is why

>>> a = 1.1 * a  # here, a new array is created
>>> print(a, a.dtype)
[ 1.1  2.2  3.3] float64  # with the expected outcome

Удивительно, раздражает, но понятно. Оператор *= не изменит тип данных array, поэтому умножение int array на float не будет выполнено в традиционном смысле этого умножения. Версия Python a = 1; a *= 1.1, с другой стороны, работает как положено.

2 голосов
/ 12 сентября 2011

Не такой большой гоча: с булевыми нарезками я иногда хотел бы сделать

  x[ 3 <= y < 7 ]

как в двойном сравнении с питоном. Вместо этого я должен написать

  x[ np.logical_and(3<=y, y<7) ]

(Если вы не знаете что-то лучше?)

Кроме того, np.logical_and и np.logical_or принимают только два аргумента каждый, я хотел бы, чтобы они принимали переменное число или список, чтобы я мог вводить более двух логических предложений.

(numpy 1.3, возможно, все это изменилось в более поздних версиях.)

2 голосов
/ 25 сентября 2010

Я обнаружил, что умножение списков элементов просто создает представление об элементах, застало меня врасплох.

>>> a=[0]*5
>>>a
[0,0,0,0,0]
>>>a[2] = 1
>>>a
[0,0,1,0,0]
>>>b = [np.ones(3)]*5
>>>b
[array([ 1.,  1.,  1.]), array([ 1.,  1.,  1.]), array([ 1.,  1.,  1.]), array([ 1.,  1.,  1.]), array([ 1.,  1.,  1.])]
>>>b[2][1] = 2
>>>b
[array([ 1.,  2.,  1.]), array([ 1.,  2.,  1.]), array([ 1.,  2.,  1.]), array([ 1.,  2.,  1.]), array([ 1.,  2.,  1.])]

Так что, если вы создадите список таких элементов и намереваетесь выполнять над ними различные операции, вы окажетесь в тупике ...

Простое решение состоит в том, чтобы итеративно создавать каждый из массивов (используя цикл for или понимание списка) или использовать массив более высокого измерения (где, например, каждый из этих одномерных массивов является строкой в ​​вашем двумерном массиве, который обычно быстрее).

2 голосов
/ 11 сентября 2009

от Нила Мартинсена-Баррелла в numpy-обсуждение 7 сентября -

Тип ndarray, доступный в Numpy: концептуально не является продолжением Итераторы Python. Если вы хотите помочь другим пользователям Numpy с этим вопрос, вы можете редактировать документацию в редакторе онлайн-документации на Numpy-документы

1 голос
/ 15 августа 2013

0-й массив None выглядит как None, но это не то же самое:

In [1]: print None
None

In [2]: import numpy

In [3]: print numpy.array(None)
None

In [4]: numpy.array(None) is None
Out[4]: False

In [5]: numpy.array(None) == None
Out[5]: False

In [6]: print repr(numpy.array(None))
array(None, dtype=object)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...