比较两个numpy数组的每一行 ValueError

3
我想逐行比较两个NumPy数组,并返回相同行的数量。
如果我使用以下代码:
a=np.array([[1,2],[3,4]])
b=np.array([[1,4],[2,3]])
comp= np.logical_and(np.equal(a,b))
correct=numpy.sum(comp)

I get the following error:

ValueError: invalid number of arguments

然而,这种方式是可行的:
np.logical_and([True, False], [False, False])

这可能很傻,但是我还是新手NumPy。 请帮忙。


1
你的意思是 np.array([[1,2], [3,4]]) 吗? - jonnybazookatone
@jonnybazookatone 是的!抱歉犯了错误。 - Abhishek Bhatia
3
np.logical_and(*np.equal(a,b))? - zero323
你在评论中比我快了,@zero323 写出了解决方案,他可以接受为答案 ;( - jonnybazookatone
你也可以使用 print(np.logical_and.reduce(np.equal(a, b)).sum()) - Padraic Cunningham
3个回答

13

我认为你想要的是类似于:

np.sum(np.all(np.equal(a, b), axis=1))

如果您喜欢,可以缩写为以下内容:

np.sum(np.all(a == b, axis=1))

这将会返回1,当:


a = np.array([[1, 2], [3, 4]])
b = np.array([[1, 2], [5, 6]])

但对于以下情况返回0

a = np.array([[1, 2], [3, 4]])
b = np.array([[1, 3], [5, 6]])

np.logical_and 对两个数组进行逐元素 and 操作。你只传递了一个数组(因此出现了 ValueError)。 - mgilson

3

接上@mgilson的回答,只是想进一步说明。您的想法是正确的,首先您完成了以下操作:

a = np.array([[1,2],[3,4]])
b = np.array([[1,4],[2,3]])
np.equal(a, b)
>>>array([[ True, False],
   [False, False]], dtype=bool)

现在,您想将此传递给np.logical_and(),如果您查看文档,它需要两个变量x1和x2 (http://docs.scipy.org/doc/numpy/reference/generated/numpy.logical_and.html)。

因此,如果您将上述数组传递进去,您将得到以下结果:

np.logical_and(np.array([[True, False], [False, False]]))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid number of arguments

这是因为np.array([[True, False], [False, True]])是一个单一的数组,也就是说,你仅提供了一个x1值,并没有提供x2值。这就是为什么回溯告诉你 'invalid number of arguments'。你需要给这个函数提供两个值。
@zero323 给出了一个解决方案,即将值解压缩到函数中。更具体地说,将第一个数组值[True, False]传递到x1,将[False, False]传递到x2:
>>> np.logical_and(*np.equal(a, b))
array([False, False], dtype=bool)

0

这样怎么样:

import numpy as np

a = np.array([['a', 'b'], ['c', 'd'],\
                  ['e', 't'], ['a', 'b'], ['a', 'b']])
[['a' 'b']
 ['c' 'd']
 ['e' 't']
 ['a' 'b']
 ['a' 'b']]

b = np.array([['a','b'],['e','t'],['r','t']])
[['a' 'b']
 ['e' 't']
 ['r' 't']]

shared_rows=0

for row in b:
    temp=a==row
    shared_rows+=sum(np.sum(temp, axis=1)==a.shape[1])

print(shared_rows)
4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接