假設我有一個陣列a,b如何在兩個陣列中找到相同的元素?
a = np.array([[262.5, 262.5, 45],
[262.5, 262.5, 15],
[262.5, 187.5, 45],
[262.5, 187.5, 15],
[187.5, 262.5, 45],
[187.5, 262.5, 15],
[187.5, 187.5, 45],
[187.5, 187.5, 15]])
b = np.array([[262.5, 262.5, 45],
[262.5, 262.5, 15],
[3,3,5],
[5,5,7],
[8,8,9]])
我嘗試了下面的代碼,但輸出不是我想要的,誰能告訴我這段代碼有什么問題?還是有其他方法可以做到這一點?
out = [x[(x == b[:,None]).all(1).any(0)] for x in a]
我想要的輸出是:
array[[262.5, 262.5, 45],
[262.5, 262.5, 15]]
uj5u.com熱心網友回復:
a[np.all([np.isin(ai, b) for ai in a], axis=1)]
或者也:
b[np.all([np.isin(bi, a) for bi in b], axis=1)]
uj5u.com熱心網友回復:
如果您沒有一直使用np(我認為是這種情況,看到串列理解) - 您可以做一個set交集
x = set(map(tuple, a)).intersection(set(map(tuple, b)))
print(x)
# {(262.5, 262.5, 15.0), (262.5, 262.5, 45.0)}
您可以將其轉換回 a np.ndarrayby
xarr = np.array(list(x))
print(xarr)
# array([[262.5, 262.5, 45. ],
# [262.5, 262.5, 15. ]])
uj5u.com熱心網友回復:
目前尚不清楚您是否想要第一個連續塊。假設不是,并且您要檢索兩個陣列中具有相同索引且所有元素都相等的所有行:
import numpy as np
a = np.array(
[
[1, 1, 1],
[2, 2, 2],
[3, 3, 3],
[4, 4, 4],
[5, 5, 5],
[6, 6, 6],
]
)
b = np.array(
[
[1, 1, 1],
[2, 2, 2],
[0, 0, 0],
[0, 0, 0],
[5, 5, 5],
]
)
expected = np.array(
[
[1, 1, 1],
[2, 2, 2],
[5, 5, 5],
]
)
第一種方法是使用 for 回圈,但可能效率不高:
out = np.array([x for x, y in zip(a, b) if np.all(x == y)])
assert np.all(out == expected)
第二種方法是矢量化的,效率更高,您只需要事先裁剪陣列,因為它們的長度不同(zip默默地這樣做):
num_rows = min(a.shape[0], b.shape[0])
a_ = a[:num_rows]
b_ = b[:num_rows]
rows_mask = np.all(a_ == b_, axis=-1)
out = a_[rows_mask, :]
assert np.all(out == expected)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/482995.html
