伙计们,
是否存在 Numpy 与 python 不同的陷阱集合, 有困惑又费时间的点?
"The horror of that moment I shall never never forget !"
"You will, though," the Queen said, "if you don't make a memorandum of it."
例如,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 会很有用。)
编辑:我希望收集六个陷阱(对于学习 Numpy 的人来说是个惊喜)。
那么,如果有共同的陷阱,或者更好的,共同的解释,
我们可以讨论将它们添加到社区 Wiki(在哪里?)
到目前为止,我们似乎还不够。
最佳答案
因为 __eq__
不返回 bool,所以在任何类型的容器中使用 numpy 数组都会阻止相等性测试,而无需针对容器进行解决。
例子:
>>> import numpy
>>> a = numpy.array(range(3))
>>> b = numpy.array(range(3))
>>> a == b
array([ True, True, True], dtype=bool)
>>> x = (a, 'banana')
>>> y = (b, 'banana')
>>> x == y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
这是一个可怕的问题。例如,您不能为使用 TestCase.assertEqual()
的容器编写单元测试,而必须编写自定义比较函数。假设我们编写了一个变通函数 special_eq_for_numpy_and_tuples
。现在我们可以在单元测试中做到这一点:
x = (array1, 'deserialized')
y = (array2, 'deserialized')
self.failUnless( special_eq_for_numpy_and_tuples(x, y) )
现在我们必须对可能用于存储 numpy 数组的每种容器类型执行此操作。此外,__eq__
可能返回一个 bool 而不是 bool 数组:
>>> a = numpy.array(range(3))
>>> b = numpy.array(range(5))
>>> a == b
False
现在我们每个特定于容器的相等比较函数也必须处理这种特殊情况。
也许我们可以用一个子类来修补这个疣?
>>> class SaneEqualityArray (numpy.ndarray):
... def __eq__(self, other):
... return isinstance(other, SaneEqualityArray) and self.shape == other.shape and (numpy.ndarray.__eq__(self, other)).all()
...
>>> a = SaneEqualityArray( (2, 3) )
>>> a.fill(7)
>>> b = SaneEqualityArray( (2, 3) )
>>> b.fill(7)
>>> a == b
True
>>> x = (a, 'banana')
>>> y = (b, 'banana')
>>> x == y
True
>>> c = SaneEqualityArray( (7, 7) )
>>> c.fill(7)
>>> a == c
False
这似乎是对的。该类还应该显式导出元素比较,因为这通常很有用。
关于python - Numpy 与直接 python 的区别在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1322380/