在python中检查矩阵中的元素

时间:2013-11-20 05:49:24

标签: 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

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

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

这是矩阵首先看的方式 -

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

当我设置值== 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]])

4 个答案:

答案 0 :(得分:5)

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

Matrix[a]

是1行矩阵,2D。类似地,

Matrix[a][b]

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

Matrix[a, b]

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

Matrix == value

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

return (Matrix == value).astype(numpy.int32)

或者如果您确实想要修改数组,可以将numpy.equal ufunc与out参数一起使用:

numpy.equal(Matrix, value, out=Matrix)

答案 1 :(得分:1)

您可以使用np.where执行此操作。

假设:

>>> matrix
array([[0, 1, 1, 2],
       [1, 0, 2, 1],
       [1, 2, 0, 1],
       [2, 1, 1, 0]])

这会将2中的matrix值替换为0,并将其他值单独保留:

>>> np.where(matrix==2,0,matrix)
array([[0, 1, 1, 0],
       [1, 0, 0, 1],
       [1, 0, 0, 1],
       [0, 1, 1, 0]])

或者,这会将2值替换为0,将任何其他值替换为1

>>> np.where(matrix==2,0,1)
array([[1, 1, 1, 0],
       [1, 1, 0, 1],
       [1, 0, 1, 1],
       [0, 1, 1, 1]])

偶:

>>> np.where(matrix==2,'  a two','not two')
array([['not two', 'not two', 'not two', '  a two'],
       ['not two', 'not two', '  a two', 'not two'],
       ['not two', '  a two', 'not two', 'not two'],
       ['  a two', 'not two', 'not two', 'not two']], 
      dtype='<U7')

答案 2 :(得分:1)

我认为这可能是由于浮点比较。 您正在寻找value == 2但似乎您的矩阵包含浮点值。 您确定矩阵中的所有2.0都是2.0而不是1.999999999或类似的东西吗?

就像这个例子(来自IPython-terminal)

In [35]: A = array([1.999999999, 1.999999999])

In [36]: A
Out[36]: array([ 2.,  2.])

In [37]: A == 2
Out[37]: array([False, False], dtype=bool)

正如您所看到的,即使矩阵A看起来像包含确切的值'2.0',它实际上也没有,它只是它的打印方式。

更新:建议的代码更改

要避免此问题,您可以使用numpy.isclose功能,只需用

替换循环
ok_mask = np.isclose(Matrix, value)
fail_mask = ~ok_mask
Matrix[ok_mask] = 1
Matrix[fail_mask] = 0

我想这也有可能比你当前的循环更快一些。

答案 3 :(得分:0)

我不熟悉scipy,但如果Matrix是普通列表,我会这样做:

#Assuming l is the length of Matrix
for a in range(l):
      for b in range(len(Matrix[a])):
               if Matrix[a][b] == value:
                    Matrix[a][b] = 1
               else:
                    Matrix[a][b] = 0

这是一个小小的演示:

>>> Matrix = [[1,2], [3,4]]
>>> value = 2
>>> l = len(Matrix)
>>> for a in range(l):
      for b in range(len(Matrix[a])):
               if Matrix[a][b] == value:
                    Matrix[a][b] = 1
               else:
                    Matrix[a][b] = 0


>>> Matrix
[[0, 1], [0, 0]]