繁体   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