比较2个numpy矩阵的每个值的最有效方法是什么?

时间:2016-10-17 23:07:04

标签: python python-3.x oop numpy matrix

我想更有效地获取相同大小的2个矩阵(ab)的每个值,并返回第三个布尔值(或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 == 0b == 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多个大小的矩阵进行这样的比较,这样你就可以看到迭代认为它们的速度很慢。

非常感谢您的帮助,我确信答案很简单,就在我面前,但我只是愚蠢。

1 个答案:

答案 0 :(得分:0)

可以使用(非常)你想要的表达式:

>>> (a == 0) & (b == 3)
matrix([[False, False],
        [ True, False]], dtype=bool)

注意,你需要括号,以便按照你的意愿使优先工作正常 - 通常&将比==更紧密地绑定。如果你不喜欢额外的括号,你可以使用更详细(虽然可以说是语义更正确的)np.logical_and函数。

另请注意,虽然没有制作副本,但仍会创建临时数组。具体来说,a == 0b == 3的结果都将在此语句中分配和释放。一般来说,这并不是什么大问题,numpy的矢量化操作仍然很快。但是,如果 的速度不够快,那么可以使用像numexpr这样的库来删除临时数组:

>>> numexpr.evaluate('(a == 0) & (b == 3)')
array([[False, False],
       [ True, False]], dtype=bool)

当然,如果您需要10,您可以在输出数组上使用result.astype(int)来生成整数数组而不是布尔值。