簡體   English   中英

比較 2 個 numpy 矩陣的每個值的最有效方法是什么?

[英]What is the most efficient way to compare every value of 2 numpy matrices?

我想更有效地獲取相同大小的 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 中唯一的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+ 大小的矩陣進行這樣的比較,以便您可以看到迭代認為它們會很慢的地方。

非常感謝您的幫助,我相信答案很簡單,就在我面前,但我只是愚蠢。

可以使用(非常)您想要的表達方式:

>>> (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)來制作整數數組而不是布爾值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM