gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:12:51 25 4
gpt4 key购买 nike

伙计们,

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com