这是一个基于我今天早期问题的知识主题.这些是我目睹的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没有副作用.看起来如果使用元组创建视图,它在某种程度上不能正确地在原始矩阵上传播任何进一步的副作用.任何见解?
为什么a:b指定从a到b-1的列?
这就是所有Python的工作方式,并且是大部分编程的传统.这使得很多的计算简单的事情,作为一个例子,它可以让一个切片的长度x[a:a + n]
是n
,允许x[:n]
并x[n:]
划分x
成两个部分.你习惯了它,从长远来看,大多数程序员都喜欢它.
看起来如果使用元组创建视图,它会以某种方式无法在原始矩阵上正确传播任何其他副作用.
执行此操作时A[:, (1, 2)]
,您没有视图,而是新阵列.当你只做切片时A[:, 1:3]
,你仍然有阵列的连续内存,所以有意义.当你通过使用迭代来挑选数组的部分时(想象一下为了更好地理解你所使用的(0, 2)
),拥有类似视图的行为将是低效和笨拙的.
归档时间: |
|
查看次数: |
606 次 |
最近记录: |