替换给定索引处的所有1 - numpy

时间:2016-06-29 00:19:05

标签: python numpy

我有一个大小为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进行了比较,但这是我得到的最好的。

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

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,:]