结合切片和高级索引时,Numpy 是否返回视图或复制?

问题描述 投票:0回答:2

以下片段:

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
>>> 

此行为是否已在任何地方记录下来,以便用户可以预测混合(高级+基本索引)操作的输出是视图还是副本?

python numpy numpy-ndarray numpy-slicing
2个回答
1
投票

索引返回一个副本,而不是视图(请参阅:我可以在指定索引处获取 numpy 数组的视图吗?(来自“花式索引”的视图))。这就是为什么

.base
给出不同的输出


0
投票

来自文档: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]])
© www.soinside.com 2019 - 2024. All rights reserved.