如何在numpy中使用高级索引和布尔数组索引而不使用循环来更改数组?

8gsdolmq  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(176)

问题:

A是一个二维的多维数组(i,j)B是一个布尔数组,它的形状与我想根据A的值定义的形状相同。
我想通过两个广播索引来定义B

  • i_b是选择第一个坐标的索引的数组。
  • ij_b是一个布尔数组,它选择索引j,给定i已经被选择。
    产品代码:

我编写的代码:

A = np.arange(50).reshape(5, 10) #shape: (i, j)
B = np.full(A.shape, False) #shape: (i, j)

#We pick first dimension
i_b = np.array([0, 2, 4])

#We pick second dimension given the first dimension has been chosen
ij_b = A[i_b]%2 == 0

#Change B according to i and ij
B[i_b][ij_b] = True

print(B[i_b][ij_b])

字符串
输出:[False False False False False False False False False False False False False False False]

B[i_b][ij_b] = True这一行好像没有改变B,为什么会这样?如何进行此操作,以矢量化的方式改变B

我知道我可以写一个循环:

for k in range(len(i_b)):
    B[i_b[k]][ij_b[k]] = True
print(B[i_b][ij_b])


输出:[ True True True True True True True True True True True True True True True]
但之后它就不再被矢量化了。

nhhxz33t

nhhxz33t1#

如文件中所述:
高级索引总是返回数据的副本(与返回视图的基本切片相反)。
我们可以解决问题的问题(从Numpy: chained boolean indexing not properly updating boolean array without using np.where),使用:
第一个月

相关问题