我有一个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]])
答案 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]]