我有一个大小为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
进行了比较,但这是我得到的最好的。
我做错了什么?有没有办法得到正确的答案?
答案 0 :(得分:2)
使用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,:]