我有一个数组,它指定沿矩阵的最后一个轴有多少个元素要更改为0。我如何有效地做到这一点呢?
x = np.ones((4, 4, 10))
change_to_zeros = np.random.randint(10, size=(4, 4))
# change_to_zeros =
# [[2 1 6 8]
# [4 0 4 8]
# [7 6 6 2]
# [4 0 7 1]]
现在我想做的是类似x[:, :, :change_to_zeros] = 0
的事情-例如,对于change_to_zeros
的第一个元素,我有change_to_zeros[0, 0] = 2
,所以我想沿着x(长度为10)的最后一个轴将第一个(或最后一个)2个元素更改为0。
澄清:例如在x[0, 0, :]
,我有一个长度为10的字符串,我想把其中的2个(change_to_zeros[0, 0] = 2
)改为0,其余的保留为1。
发布于 2018-07-25 03:36:38
您可以使用change_to_zeros[:,:,None] > np.arange(x.shape[-1])
创建一个布尔数组(形状与x
相同),然后将零分配给_true_s:
x[change_to_zeros[:,:,None] > np.arange(x.shape[-1])] = 0
检查结果:
change_to_zeros[0,0]
# 2
x[0,0]
# array([ 0., 0., 1., 1., 1., 1., 1., 1., 1., 1.])
change_to_zeros[0,2]
# 7
x[0,2]
# array([ 0., 0., 0., 0., 0., 0., 0., 1., 1., 1.])
https://stackoverflow.com/questions/51506252
复制相似问题