python - Numpy 与直接 python 的区别在哪里?

标签 python numpy

伙计们,

是否存在 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/

相关文章:

python - 使用编码打开内存映射文件

python - 如何使用flask-sqlalchemy从多个表中获取数据

python - 如果一直不需要模块,导入模块的最佳方法是什么?

python - 如何将二维列表转换为二维 numpy 数组?

python - 格式化 numpy 数组并保存到 *.txt

python - 为什么 Mean Average Percentage Error(mape) 非常高?

python - 如果在 python 中发生错误,则打印换行符

python - 基于其他数组的掩码数组?

python - 从两个 numpy 数组中删除匹配的元素

python numpy 列表操作