在python中检查矩阵中的元素

Nil*_*lli 4 python matrix scipy

我有一个scipy矩阵.如果它满足某个条件,我试图将它替换为1,如果不满足则尝试将其替换为0.

for a in range(0,l):
      for b in range(0,l):
               if Matrix[a][b] == value:
                    Matrix[a][b] = 1
               else:
                    Matrix[a][b] = 0
Run Code Online (Sandbox Code Playgroud)

我的矩阵中充满了具有"价值"的元素.然而它给出了输出作为一个完全为0的矩阵.

这在以前的类似脚本上工作过.它可能与矩阵的结构有关吗?

这是矩阵首先看到的方式 -

[ [0   1.  1.  2.]
  [1.  0.  2.  1.]
  [1.  2.  0.  1.]
  [2.  1.  1.  0.]]
Run Code Online (Sandbox Code Playgroud)

当我设置值== 1.我得到所有的1到1,所有的2到零.这就是我想要的.

但是,当我设置值== 2.我把所有东西都归零.

当我做所有建议的时候.

[[ 0.  1.  1.  2.  1.  2.  2.  3.]
 [ 1.  0.  2.  1.  2.  1.  3.  2.]
 [ 1.  2.  0.  1.  2.  3.  1.  2.]
 [ 2.  1.  1.  0.  3.  2.  2.  1.]
 [ 1.  2.  2.  3.  0.  1.  1.  2.]
 [ 2.  1.  3.  2.  1.  0.  2.  1.]
 [ 2.  3.  1.  2.  1.  2.  0.  1.]
 [ 3.  2.  2.  1.  2.  1.  1.  0.]]

>>  np.where(matrix==2,1,0)
>> array([[0, 0, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 0, 0, 0, 0]])
Run Code Online (Sandbox Code Playgroud)

use*_*ica 5

如果你实际上有一个矩阵,而不是一个ndarray,那么

Matrix[a]
Run Code Online (Sandbox Code Playgroud)

是1行矩阵和2D.同样的,

Matrix[a][b]
Run Code Online (Sandbox Code Playgroud)

也是一个矩阵(或一个IndexError,因为Matrix[a]只有一行).你需要使用

Matrix[a, b]
Run Code Online (Sandbox Code Playgroud)

获得元素.这是使用矩阵可能很尴尬的原因之一.请注意,您可以使用

Matrix == value
Run Code Online (Sandbox Code Playgroud)

得到一个布尔矩阵,然后用astype它将它转换成你想要的类型.这将是更少的代码,它运行得更快.因此,如果您的dtype是int32,那么您发布的整个loopy事件可以替换为

return (Matrix == value).astype(numpy.int32)
Run Code Online (Sandbox Code Playgroud)

或者如果你真的想要修改数组,你可以使用numpy.equalout参数的ufunc :

numpy.equal(Matrix, value, out=Matrix)
Run Code Online (Sandbox Code Playgroud)