我有一个大小为10-by-10的二进制矩阵。我想将给定索引处矩阵中的所有1's更改为-1

我能够得到这样的东西

import numpy as np
mat = np.random.randint(2, size=(10, 10))
index = [6,7,8,9]

mat[(mat[index,:] == 1).nonzero()] = -1
print(mat)


当我打印这个时,我得到这样的东西

[[-1  0 -1  1  0 -1 -1  1 -1  0]
 [ 1  0  1 -1 -1  1 -1 -1 -1  1]
 [ 0 -1  1  0 -1 -1 -1  1 -1  0]
 [-1 -1 -1 -1 -1  1 -1  1 -1  1]
 [ 1  1  1  1  0  0  0  0  0  1]
 [ 1  1  1  1  0  0  0  0  1  0]
 [ 1  0  1  0  0  1  1  0  1  0]
 [ 0  0  0  1  1  0  1  1  1  0]
 [ 0  1  0  0  1  1  1  0  1  0]
 [ 1  1  1  1  1  0  1  0  1  0]]


但这似乎是错误的,因为索引位于矩阵的末尾,我想要的是

[[ 1  0  1  1  0  1  1  1  1  0]
 [ 1  0  1  1  1  1  1  1  1  1]
 [ 0  1  1  0  1  1  1  1  1  0]
 [ 1  1  1  1  1  1  1  1  1  1]
 [ 1  1  1  1  0  0  0  0  0  1]
 [ 1  1  1  1  0  0  0  0  1  0]
 [-1  0 -1  0  0 -1 -1  0 -1  0]
 [ 0  0  0 -1 -1  0 -1 -1 -1  0]
 [ 0 -1  0  0 -1 -1 -1  0 -1  0]
 [-1 -1 -1 -1 -1  0 -1  0 -1  0]]


我知道不需要nonzero(),因为我已经将内容与1进行了比较,但这是我所能得到的最好的。

我究竟做错了什么?有没有办法得到正确的答案?

最佳答案

使用numpy.where选择基于mat的条件元素:

import numpy as np
mat = np.random.randint(2, size=(10, 10))
index = [6,7,8,9]

mat[index,:] = np.where(mat[index,:],-1,mat[index,:])
print(mat)


根据原始值的真实性,这将覆盖给定的mat行。这些行中的原始值是1时,它们将被-1覆盖,否则将被保留。

尽管请注意,如果您的二进制矩阵只有零和一,则可以翻转给定行中每个元素的符号,因为0对于此转换是不变的:

mat[index,:] = -mat[index,:]

关于python - 在给定索引处替换所有1-numpy,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38088323/

10-12 22:25