Numpy Indexing - 关于奇怪行为/不一致的问题

bjo*_*sen 2 python numpy

这是一个基于我今天早期问题的知识主题.这些是我目睹的numpy行为中的一些奇怪的不一致.

首先,如果您运行此代码:

A = ones((10,4))
view = A[:,1]
view.fill(7)
A
Run Code Online (Sandbox Code Playgroud)

这会将第2列更改为全7,因为数组从0开始索引,而切片只是同一矩阵的视图.太棒了,这正是我想要发生的事情.

现在,如果你运行这个:

A = ones((10,4))
view = A[:,1:2]
view.fill(7)
A
Run Code Online (Sandbox Code Playgroud)

它将与第一个例子具有相同的效果.为什么a:b指定从a到b-1的列?这种语言有特定原因吗?似乎如果我输入说1:3,那应该给我第1,2和3列 - 而不是1和2.

最后,如果你运行这个:

A = ones((10,4))
view = A[:,(1,2)]
view.fill(7)
A
Run Code Online (Sandbox Code Playgroud)

对A没有副作用.看起来如果使用元组创建视图,它在某种程度上不能正确地在原始矩阵上传播任何进一步的副作用.任何见解?

Mik*_*ham 5

为什么a:b指定从a到b-1的列?

这就是所有Python的工作方式,并且是大部分编程的传统.这使得很多的计算简单的事情,作为一个例子,它可以让一个切片的长度x[a:a + n]n,允许x[:n]x[n:]划分x成两个部分.你习惯了它,从长远来看,大多数程序员都喜欢它.

看起来如果使用元组创建视图,它会以某种方式无法在原始矩阵上正确传播任何其他副作用.

执行此操作时A[:, (1, 2)],您没有视图,而是新阵列.当你只做切片时A[:, 1:3],你仍然有阵列的连续内存,所以有意义.当你通过使用迭代来挑选数组的部分时(想象一下为了更好地理解你所使用的(0, 2)),拥有类似视图的行为将是低效和笨拙的.