使用列表索引numpy数组时避免复制

时间:2014-05-23 01:49:18

标签: python numpy

是否有一种使用列表或任何其他集合对数组进行索引的简单方法,以便不进行复制(只是获取数组的视图)。请不要尝试按照下面的代码片段来回答问题 - 我用来索引元素的列表并不总是很短(即数千个元素,而不是4个),列表是算法的产物,因此,数字不一定是有序的等等。

例如,在下面的代码中,在两种情况下都选择了第1,2和3列,但仅在第一种情况下返回了数据视图:

>>> a[:,1:4]
>>> b = a[:,1:4]
>>> b.base is a
True
>>> c = a[:,[1,3,2]]
>>> c.base is a
False

1 个答案:

答案 0 :(得分:7)

花式索引(使用索引列表访问数组的元素)总是产生一个副本,因为numpy无法将其转换为相同数据的新视图,但具有不同的固定步幅和形状,从特定元素开始。

在引擎盖下,numpy数组是一个指向数组内存中第一个元素的指针,一个dtype,形状和有关在内存中移动多远以获取每个维度(下一行,列等)的信息)和一些旗帜。一些预先存在的内存上的视图只指向该数组中的某个元素,并摆弄步幅和形状。花式索引通常指定对该预先存在的内存的随机访问,并且您不能强制该数据进入必要的形式,因此必须进行复制。