[英]What is the most efficient way to compare every value of 2 numpy matrices?
我想更有效地獲取相同大小的 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 中唯一的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 == 0
和b == 3
結果都將在此語句中分配和釋放。 一般來說,這沒什么大不了的,numpy 的矢量化操作仍然很快。 但是,如果這對您來說還不夠快,您可以使用像numexpr
這樣的庫來刪除臨時數組:
>>> numexpr.evaluate('(a == 0) & (b == 3)')
array([[False, False],
[ True, False]], dtype=bool)
當然,如果您需要1
和0
,您可以在輸出數組上使用result.astype(int)
來制作整數數組而不是布爾值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.