我找不到使用 Python 執行 Matlab 的“ismember(a,b,'rows')”的有效方法,其中 a 和 b 分別是大小為 (ma,2) 和 (mb,2) 的陣列,m 是數字的情侶。
ismember 模塊(https://pypi.org/project/ismember/)崩潰是因為在某些時候,即在執行 np.all(a[:, None] == b, axis=2).any(axis=1) 時它需要創建一個大小為 (ma,mb,2) 的陣列,而且它太大了。此外,即使該函式有效(因為陣列足夠小),它也比在 Matlab 中慢大約 100 倍。我猜這是因為 Matlab 使用了內置的 mex 函式。為什么 python 沒有我認為如此重要的功能?我在計算中無數次使用它...
ps:此處提出的解決方案Python 版本的 ismember with 'rows' 和 index不對應于真正的 matlab 的 ismember 函式,因為它不能逐個元素地作業,即它不能驗證 'a' 的幾個值存在于 ' b',但前提是 'a' 的每一列的值存在于 'b' 的每一列中。
uj5u.com熱心網友回復:
您可以使用np.unique(array,axis=0)以查找陣列的相同行。因此,使用此功能,您可以將 2D 問題簡化為 1D 問題,可以通過以下方式輕松解決np.isin():
import numpy as np
# Dummy example array:
a = np.array([[1,2],[3,4]])
b = np.array([[3,5],[2,3],[3,4]])
# ismember_row function, which rows of a are in b:
def ismember_row(a,b):
# Get the unique row index
_, rev = np.unique(np.concatenate((b,a)),axis=0,return_inverse=True)
# Split the index
a_rev = rev[len(b):]
b_rev = rev[:len(b)]
# Return the result:
return np.isin(a_rev,b_rev)
res = ismember_row(a,b)
# res = array([False, True])
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/440058.html
上一篇:MATLAB中有這個功能嗎?
