Numpy数组__setitem__方法的异常赋值行为疑问
问题原因
你遇到的是Numpy花式索引的配对规则问题:
当你使用a[[1, 3], [0, 2]]这种双一维数组索引时,Numpy会把两个数组按位置配对,也就是取(行索引[0], 列索引[0])和(行索引[1], 列索引[1])这两个单独的元素——也就是(1,0)和(3,2),所以只会把这两个位置设为0,这就是你看到结果的原因。
而你预期的是选中第1行的0、2列,以及第3行的0、2列,这需要的是行和列的笛卡尔积索引,也就是所有行索引和列索引的组合。
正确实现方式
有两种常用的解决方法:
- 方法一:用
np.ix_生成可广播的索引网格,让行和列做笛卡尔积:
import numpy as np a = np.array([ [11, 12, 13], [21, 22, 23], [31, 32, 33], [41, 42, 43] ]) a[np.ix_([1, 3], [0, 2])] = 0
np.ix_会把[1,3]转换成[[1],[3]],[0,2]转换成[[0,2]],这样两者广播后就能覆盖所有需要的位置:(1,0)、(1,2)、(3,0)、(3,2)。
- 方法二:直接分两次赋值,逻辑更直观:
a[1, [0, 2]] = 0 a[3, [0, 2]] = 0
执行后就能得到你预期的结果:
[[11 12 13] [ 0 22 0] [31 32 33] [ 0 42 0]]
内容的提问来源于stack exchange,提问作者IzaeDA
相关产品推荐
相关产品推荐

