民间,
是否有一些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] )
(我并没有敲打麻木,那里没有很多好的工作,只是认为常见问题解答或维基百科将很有用。)
编辑:我希望能收集到半个陷阱(人们学习Numpy的惊喜)。 然后,如果有常见的陷阱,或者更好的是常见的解释,我们可以讨论将其添加到社区Wiki(在哪里?),到目前为止我们还不够。
对我而言,最大的难题是几乎每个标准运算符都超载,无法在整个阵列中分布。
定义一个列表和一个数组
>>> l = range(10) >>> l [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> import numpy >>> a = numpy.array(l) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
乘法复制python列表,但分布在numpy数组上
>>> l * 2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> a * 2 array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
未在python列表上定义加法和除法
>>> l + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate list (not "int") to list >>> a + 2 array([ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) >>> l / 2.0 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for /: 'list' and 'float' >>> a / 2.0 array([ 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5])
numpy重载有时将列表视为数组
>>> a + a array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18]) >>> a + l array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])