以下片段:
import numpy as np
x = np.arange(25).reshape(5, 5)
print(x.base)
y = x[:2, [0, 2]]
print(y.base)
输出
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
24]
[[0 5]
[2 7]]
从docs我无法理解
y
是否应该查看或复制。知道为什么 y
是一个视图以及为什么它的基础与 x
不同吗?
另一个例子:
>>> import numpy as np
>>> x = np.arange(25).reshape(5, 5)
>>> x[:2, [0,2]].base
array([[0, 5],
[2, 7]])
>>> x[[0,2], :2].base
>>>
此行为是否已在任何地方记录下来,以便用户可以预测混合(高级+基本索引)操作的输出是视图还是副本?
索引返回一个副本,而不是视图(请参阅:我可以在指定索引处获取 numpy 数组的视图吗?(来自“花式索引”的视图))。这就是为什么
.base
给出不同的输出
来自文档:ndarray.base
如果内存来自其他对象,则为基础对象。
逐步构建数组
>>> xbase = np.arange(25)
>>> xbase.base is None
True
>>>
>>> x = xbase.reshape(5,5)
>>> x.base is xbase
True
reshape()
返回一个视图,因此修改 x
或其切片也会改变 xbase
>>> x2 = x[2:]
>>> x2.base is xbase
True
>>> x2[-1][0] = 7777
>>> xbase
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 7777, 21,
22, 23, 24])
高级索引返回副本
高级索引始终返回数据的副本(与返回视图的基本切片相比)。
>>> y = x[:2, [0, 2]]
>>> y.base is xbase
False
>>> x2[-1][0] = 7777
>>> y[0][0] = 9999
>>> xbase
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 7777, 21,
22, 23, 24])
xbase
在 y
更改后保持不变。
最后:
y
不是另一个对象的视图,其基础与源对象不同。有趣的是
y.base
不是“无”,任何更改都会反映在其基础中
>>> y.base is None
False
>>> y.base
array([[0, 5],
[2, 7]])
>>> y[0][0] = 9999
>>> y
array([[9999, 2],
[ 5, 7]])
>>> y.base
array([[9999, 5],
[ 2, 7]])