python - numpy View 如何知道它引用的值在原始 numpy 数组中的位置?

标签 python arrays numpy

据我了解,numpy 数组是在连续的内存块中存储值的对象,而 Python 的内置容器(列表、元组、集合、字典)包含对对象的引用。 numpy 数组的基本切片返回包含这些值的指定子集的 View 。

从表面上看, View 看起来像另一个 numpy 数组(type(aView) 返回 numpy.ndarray),但它的值不是副本,而是与原始数组的值相同;就地更改 View 的值也会更改原始数组的值。

View 如何做到这一点?我想一个 View 应该包含某种指向原始数组中的值的指针,但是有几件事让我停顿了一下:

  1. 数组中的值不是对象,我不知道如何对同一对象的小片段进行引用。

  2. 创建数组的副本比创建 View 慢得多,如果 View 只是某种指针值的数组,我希望创建副本和 View 的速度大致相同.

最佳答案

NumPy 数组知道它的基地址、数据类型、形状和跨度。大多数应用程序不需要显式地处理这些步幅,但它们是其中一些工作的原因。步长表示必须添加多少字节才能将给定维度增加一个逻辑单元(例如行)。

如果您从地址 0x1000 处的 3x3 float64(又名 f8)数组开始,并且您想要查看从原始中心开始的 2x2 子数组,您只需将基地址增加 4 个元素(整个第一行 3 个,从中间行的左侧移动到 1 个)并记住每一行在前一行之后开始 24 个字节(尽管只有 16 个字节长) .

从概念上讲,我们从这里出发:

base=0x1000
shape=(3,3)
strides=(24,8)
dtype='f8'

对此:

base=0x1020 (added 1*24 + 1*8 for [1:,1:] view)
shape=(2,2)
strides=(24,8)
dtype='f8'

View 采用这些元素:

. . .
. 4 5
. 7 8

一些标志在 View 上进行了调整,例如需要取消设置的 C_CONTIGUOUS 标志,因为 View 不再是连续区域。

Strides 不仅支持 NumPy 数组的 View ,还支持并非源自 NumPy 的数据结构的 View 。例如,如果您有一个 C 结构数组,并且每个结构的第一个成员是一个点 (x,y),您可以通过将步幅设置为整个结构,尽管 dtype 只是两个数字。

关于python - numpy View 如何知道它引用的值在原始 numpy 数组中的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53799741/

相关文章:

python - 如何将图例置于情节之外

python - 如何在pygame中上下移动一个盒子[矩形为正方形]?

javascript - 将 rowdatapacket 转换为数组,如何将 mysql node.js api rowdatapacket 转换为数组,字符串转换为数组

带有字段和子对象数组的 JavaScript 对象数组?

python - numpy:如何根据一堆标准选择行

Python:Matplotlib - 多个数据集的概率图

javascript - 如何将数组从 Controller 传递到 _layout.cshtml

validation - 如何将多类分类后得到的结果映射到1和0

python-3.x - numpy:从 ndarray 创建双端队列,这是一个数组数组

python - Flask jsonify 返回奇怪的数组?