【发布时间】:2021-01-17 17:12:32
【问题描述】:
我有一个像这样的小测试代码:
import numpy as np
foo = np.zeros(1, dtype=int)
bar = np.zeros((10, 1), dtype=int)
foo_copy = np.copy(foo)
bar[-1] = foo_copy
foo_copy[-1] = 10
print(foo_copy)
print(bar)
我原以为foo_copy 和bar 的最后一个元素都包含值10,但bar 的最后一个元素仍然是一个np 数组,其中的值为0。
[10]
[[0]
[0]
[0]
[0]
[0]
[0]
[0]
[0]
[0]
[0]] # <<--- why not 10?
最后一个元素不是指向foo_copy吗?
或者在所有作业中,np 都会复制数据而我无法使用原始 ndarray 来更改它?
如果是这样,有没有办法将最后一个元素保留为指向 foo_bar 的指针?
【问题讨论】:
-
numpy.ndarray的不保留指针。这就是他们的全部目的,为原始数值的真正多维数组提供高效、快速的实现。您也许可以通过使用dtype=object来破解某些东西,这基本上意味着 dtype 是 PyObject 指针,尽管您可能真的不应该这样做。如果是这种情况,您应该几乎只使用常规的 python 列表,因为带有 dtype=object 的numpy数组几乎是一个效率较低的 python 列表。 -
IOW,当你想要列表语义时,为什么要使用数组?
-
@juanpa.arrivillaga 这只是一个典型的例子,在我的代码中我确实需要高性能,但并不清楚这一点。你想把它作为答案吗?那我就可以接受了。谢谢!
-
但是你会失去 numpy 的高性能这种性能来自于不使用指向 Python 对象的指针。如果您使用指向 Python 对象的指针,那么您将再次获得一个效率较低的 Python 列表。无论如何,我可以发誓我已经看到了另一个问题,它详细解释了这一点,试图找到它以将其作为重复目标提供
-
numpy中的高性能来自于使用编译方法。那些主要使用数字 dtypes,例如int。您可能需要(重新)阅读numpy基础知识,重点关注数组的存储方式。bar的元素是整数,而不是数组(或列表)。
标签: python numpy numpy-ndarray