簡體   English   中英

檢查numpy數組中有多少numpy數組等於另一個不同大小的numpy數組中的其他numpy數組

[英]Check how many numpy array within a numpy array are equal to other numpy arrays within another numpy array of different size

我的問題

假設我有

a = np.array([ np.array([1,2]), np.array([3,4]), np.array([5,6]), np.array([7,8]), np.array([9,10])])
b = np.array([ np.array([5,6]), np.array([1,2]), np.array([3,192])])

它們是兩個不同大小的數組,包含其他數組(內部數組具有相同的大小!)

我想計算b中有多少項(即內部數組)。 請注意,我沒有考慮他們的立場!

我怎樣才能做到這一點?

我的嘗試

count = 0
for bitem in b:
     for aitem in a:
         if aitem==bitem:
               count+=1

有沒有更好的辦法? 特別是在一行中,也許有一些理解..

這是一個簡單的方法:

a = np.array([ np.array([1,2]), np.array([3,4]), np.array([5,6]), np.array([7,8]), np.array([9,10])])
b = np.array([ np.array([5,6]), np.array([1,2]), np.array([3,192])])

count = np.count_nonzero(
    np.any(np.all(a[:, np.newaxis, :] == b[np.newaxis, :, :], axis=-1), axis=0))

print(count)
>>> 2

你可以在一個班輪里做你想做的事情如下:

count = sum([np.array_equal(x,y) for x,y in product(a,b)])

說明

以下是對正在發生的事情的解釋:

  1. 使用itertools.product迭代這兩個數組,它將在兩個數組的笛卡爾積上創建一個迭代器。
  2. 使用np.array_equal比較來自步驟1.的元組(x,y)中的每兩個數組
  3. 在列表中使用sum時,True等於1

完整示例:

最終代碼如下所示:

import numpy as np 
from itertools import product 
a = np.array([ np.array([1,2]), np.array([3,4]), np.array([5,6]), np.array([7,8]), np.array([9,10])])
b = np.array([ np.array([5,6]), np.array([1,2]), np.array([3,192])])
count = sum([np.array_equal(x,y) for x,y in product(a,b)])
# output: 2

numpy_indexed包包含針對這些類型問題的高效(nlogn,通常)和矢量化解決方案:

import numpy_indexed as npi
count = len(npi.intersection(a, b))

請注意,這與雙循環略有不同,例如,丟棄a和b中的重復條目。 如果你想在b中保留重復項,這將有效:

count = npi.in_(b, a).sum()

a中的重復條目也可以通過執行npi.count(a)並將其結果分解來處理; 但無論如何,我只是為了說明目的而漫無目的,因為我想這種區別對你來說可能無關緊要。

您可以將行轉換為dtype = np.void ,然后在生成的1d數組中使用np.in1d

def void_arr(a):
    return np.ascontiguousarray(a).view(np.dtype((np.void, a.dtype.itemsize * a.shape[1]))) 

b[np.in1d(void_arr(b), void_arr(a))]

array([[5, 6],
       [1, 2]])

如果您只想要交叉點的數量,那就是

np.in1d(void_arr(b), void_arr(a)).sum()

2

注意:如果ba有重復項,則np.in1d(void_arr(b), void_arr(a)).sum()可能不等於np.in1d(void_arr(a), void_arr(b)).sum() 我已經逆轉,從我原來的答案,以配合您的問題(即有多少元素ba ?)

有關更多信息,請參閱此處的第三個答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM