我的问题
假设我有
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
有更好的方法吗?特别是在一行中,也许有一些理解..
答案 0 :(得分:2)
这是一种简单的方法:
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
答案 1 :(得分:2)
您可以按照以下方式在一个班轮中执行您想要的操作:
count = sum([np.array_equal(x,y) for x,y in product(a,b)])
以下是对正在发生的事情的解释:
1.
的元组(x,y)中的每两个数组
最终代码如下:
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
答案 2 :(得分: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)并将其结果分解来处理;但无论如何,我只是为了说明目的而漫无目的,因为我想这种区别对你来说可能无关紧要。
答案 3 :(得分:1)
您可以将行转换为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
注意:如果b
或a
中有重复项,那么np.in1d(void_arr(b), void_arr(a)).sum()
可能不会等于np.in1d(void_arr(a), void_arr(b)).sum()
。我已将原始答案中的顺序与您的问题相对应(即b
中有多少a
元素?)
有关详细信息,请参阅第三个答案here