我想更有效地获取相同大小的2个矩阵(a
和b
)的每个值,并返回第三个布尔值(或1个0矩阵以使事情变得干净)矩阵c
包含条件的结果。
示例:
条件:For a == 0 and b == 3
a = [[1 0]
[0 1]]
b = [[3 5]
[3 9]]
会回来:
c = [[0 0]
[1 0]]
[0,1]
是a == 0
和b == 3
唯一的地方,因此它是c {/ p>中唯一的地方True
这是我到目前为止的代码:
import numpy as np
a = np.matrix("1, 0; 0 1")
print(a,'\n')
b = np.matrix("3, 5; 3 9")
print(b,'\n')
c = []
for x in range(0,np.shape(a)[1]):
row = []
for y in range(0,np.shape(a)[1]):
row.append(int(a[x,y] == 0 and b[x,y] == 3)) # the int() is there just to keep things tighty for the 3 prints
c.append(row)
c = np.matrix(c)
print(c)
结果:
[[1 0]
[0 1]]
[[3 5]
[3 9]]
[[0 0]
[1 0]]
我也可以使用:
a=a==0
b=b==3
c=a&b
但是这需要制作a和b的副本,并且使用大矩阵仍然有效吗?
为什么我不能只使用a == 0 & b == 3
?
我需要对1000多个大小的矩阵进行这样的比较,这样你就可以看到迭代认为它们的速度很慢。
非常感谢您的帮助,我确信答案很简单,就在我面前,但我只是愚蠢。
答案 0 :(得分:0)
你可以使用(非常)你想要的表达式:
>>> (a == 0) & (b == 3)
matrix([[False, False],
[ True, False]], dtype=bool)
注意,你需要括号,以便按照你的意愿使优先工作正常 - 通常&
将比==
更紧密地绑定。如果你不喜欢额外的括号,你可以使用更详细(虽然可以说是语义更正确的)np.logical_and
函数。
另请注意,虽然没有制作副本,但仍会创建临时数组。具体来说,a == 0
和b == 3
的结果都将在此语句中分配和释放。一般来说,这并不是什么大问题,numpy的矢量化操作仍然很快。但是,如果 的速度不够快,那么可以使用像numexpr
这样的库来删除临时数组:
>>> numexpr.evaluate('(a == 0) & (b == 3)')
array([[False, False],
[ True, False]], dtype=bool)
当然,如果您需要1
和0
,您可以在输出数组上使用result.astype(int)
来生成整数数组而不是布尔值。