亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何匹配包含在兩個 numpy 數組中的成對值

如何匹配包含在兩個 numpy 數組中的成對值

繁星coding 2021-11-16 16:05:11
我有兩組坐標,想找出該coo組的哪些坐標與該組中的任何坐標相同targets。我想知道coo集合中的索引,這意味著我想獲取索引列表或布爾值列表。import numpy as npcoo = np.array([[1,2],[1,6],[5,3],[3,6]]) # coordinatestargets = np.array([[5,3],[1,6]]) # coordinates of targetsprint(np.isin(coo,targets))[[ True False] [ True  True] [ True  True] [ True  True]]所需的結果將是以下兩個之一:[False True True False] # bool list[1,2] # list of concerning indices我的問題是,那...np.isin沒有 -axis屬性,所以我可以使用axis=1.即使將邏輯和應用于輸出的每一行也會返回True最后一個元素,這是錯誤的。我知道循環和條件,但我確信 Python 配備了更優雅的解決方案的方法。
查看完整描述

3 回答

?
aluckdog

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.


查看完整回答
反對 回復 2021-11-16
?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

numpy_indexed的量化方式這種類型的包實現的功能(聲明:我是它的作者)。遺憾的是,numpy 缺少很多這種開箱即用的功能;我開始使用 numpy_indexed 的目的是將它合并到 numpy 中,但是存在一些向后兼容性問題,并且像這樣的大包往往移動緩慢。所以這在過去的 3 年里沒有發生過;但是現在 Python 打包生態系統運行良好,只需在您的環境中再添加一個包也同樣簡單,真的。

import numpy_indexed as npi
bools = npi.in_(targets, coo)

這將具有類似于@fountainhead 發布的解決方案的時間復雜度(根據當前接受的答案,是對數而不是線性),而且 npi 庫將為您提供自動化測試的安全性,以及許多其他方便的選項,如果您決定從稍微不同的角度處理問題。


查看完整回答
反對 回復 2021-11-16
?
大話西游666

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'我們想要的視圖中的每個元素指定要兩個整數的元組


查看完整回答
反對 回復 2021-11-16
  • 3 回答
  • 0 關注
  • 237 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號