Python:利用NumPy数组A的指定索引将数组B对应位置置零
解决NumPy数组按索引替换的问题
嘿,我来帮你搞定这个问题!你已经成功找到了A中大于4的元素的索引,接下来只需要用正确的方式利用这些索引修改B就可以了,甚至还有更简洁的方法哦😉
方法1:使用你已经得到的argwhere索引
你已经通过a = np.argwhere(A > 4)得到了索引数组[[0 1], [0 2], [2 0]],但直接用B[a] = 0是不行的——因为argwhere返回的是每行对应一个(行,列)索引对的二维数组,我们需要把行索引和列索引分开提取出来,再组合访问B的位置:
import numpy as np A = np.array([ [1,6,5], [2,3,4], [8,3,0] ]) B = np.array([ [3,2,1], [9,2,8], [2,1,8] ]) # 获取A中大于4的元素的索引 a = np.argwhere(A > 4) # 拆分行索引和列索引,赋值为0 B[a[:, 0], a[:, 1]] = 0 print(B)
方法2:更简洁的布尔掩码(推荐)
其实你完全可以跳过argwhere这一步,直接利用NumPy的布尔索引特性,一步到位完成修改:
import numpy as np A = np.array([ [1,6,5], [2,3,4], [8,3,0] ]) B = np.array([ [3,2,1], [9,2,8], [2,1,8] ]) # 直接用A>4生成的布尔数组作为索引,将对应位置设为0 B[A > 4] = 0 print(B)
两种方法运行后都会输出你期望的结果:
[[3 0 0] [9 2 8] [0 1 8]]
为什么直接用B[a] = 0不行?
argwhere返回的是形状为(N,2)的数组,如果你直接写B[a],NumPy会把每一行的索引对当成行索引去取B的整行,这显然不是你想要的效果。而B[a[:,0], a[:,1]]则是把所有行索引和列索引分别打包,精准定位到每个需要修改的元素位置。
内容的提问来源于stack exchange,提问作者Laveena
相关产品推荐
相关产品推荐

