【问题标题】:What is the most efficient way to compare every value of 2 numpy matrices?比较 2 个 numpy 矩阵的每个值的最有效方法是什么?
【发布时间】:2016-10-17 23:07:04
【问题描述】:

我想更有效地将 2 个相同大小的矩阵(ab)的每个值返回到 matrixc包含条件的结果。

例子:

条件: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 中 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+ 大小的矩阵进行这样的比较,这样你就可以看到迭代认为它们会很慢的地方。

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

【问题讨论】:

  • 为什么c = (a == 0) & (b == 3).astype(int) 会复制?
  • "为什么我不能只使用 a == 0 & b == 3 ?" - 只是优先级。您需要添加括号来消除歧义,例如(a == 0) & (b == 3)
  • @PadraicCunningham 和 user2357112 谢谢我只是不知道我需要括号
  • @Whud,不用担心,a=a==0 没有复制 a,它返回的是一个布尔数组,它与复制 a 的实际副本不同
  • @PadraicCunningham 我需要多个不同的条件来询问 a 和 b 所以如果我想以不同的方式查看矩阵,我需要制作一个副本。 (直到我了解了括号的事情)

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


【解决方案1】:

可以使用(几乎)你想要的表达方式:

>>> (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) 来制作整数数组而不是布尔数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多