3 回答

TA貢獻1847條經驗 獲得超7個贊
對于大型陣列,此解決方案的擴展性更差,對于這種情況,其他建議的答案將表現得更好。
這是利用 的一種方法broadcasting:
(coo[:,None] == targets).all(2).any(1)
# array([False, True, True, False])
細節
通過添加第一個軸的直接比較來檢查每一行coo是否與另一行匹配target,coo因此它可以針對 廣播targets:
(coo[:,None] == targets)
array([[[False, False],
[ True, False]],
[[False, False],
[ True, True]],
[[ True, True],
[False, False]],
[[False, False],
[False, True]]])
然后檢查ndarrays沿第二個軸的all值True:
(coo[:,None] == targets).all(2)
array([[False, False],
[False, True],
[ True, False],
[False, False]])
最后用于any檢查哪些行至少有一個True.

TA貢獻1827條經驗 獲得超8個贊
該numpy_indexed的量化方式這種類型的包實現的功能(聲明:我是它的作者)。遺憾的是,numpy 缺少很多這種開箱即用的功能;我開始使用 numpy_indexed 的目的是將它合并到 numpy 中,但是存在一些向后兼容性問題,并且像這樣的大包往往移動緩慢。所以這在過去的 3 年里沒有發生過;但是現在 Python 打包生態系統運行良好,只需在您的環境中再添加一個包也同樣簡單,真的。
import numpy_indexed as npi bools = npi.in_(targets, coo)
這將具有類似于@fountainhead 發布的解決方案的時間復雜度(根據當前接受的答案,是對數而不是線性),而且 npi 庫將為您提供自動化測試的安全性,以及許多其他方便的選項,如果您決定從稍微不同的角度處理問題。

TA貢獻1817條經驗 獲得超14個贊
這是一個簡單直觀的解決方案,它實際使用numpy.isin(), 來匹配元組,而不是匹配單個數字:
# View as a 1d array of tuples
coo_view = coo.view(dtype='i,i').reshape((-1,))
targets_view = targets.view(dtype='i,i').reshape((-1,))
result = np.isin(coo_view, targets_view)
print (result)
print(result.nonzero()[0])
輸出:
[False True True False]
[1 2]
筆記:
這些視圖的創建不涉及任何數據復制。
在dtype='i,i'我們想要的視圖中的每個元素指定要兩個整數的元組
添加回答
舉報