【问题标题】:Compare two numpy arrays row-wise ValueError按行比较两个numpy数组ValueError
【发布时间】:2018-04-07 02:22:50
【问题描述】:

我想逐行比较两个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)

我收到以下错误:

ValueError: invalid number of arguments

但是,这是可行的:

np.logical_and([True, False], [False, False])

这可能很愚蠢,但我是 NumPy 的新手。请帮忙。

【问题讨论】:

  • 感谢@zero323 编辑。
  • 你的意思是np.array([[1,2], [3,4]])
  • @jonnybazookatone 是的!抱歉弄错了。
  • np.logical_and(*np.equal(a,b))?
  • 在 cmets @zero323 上也击败了我,写下解决方案,他可以接受作为答案;(

标签: python numpy


【解决方案1】:

我认为你想要类似的东西:

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 对 2 个数组进行逐个元素 and。你只传递一个数组(因此是ValueError)。
【解决方案2】:

只是为了扩展@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 值。这就是为什么回溯会告诉您“无效的参数数量”。您需要为此函数提供两个值。

@zero323 正确地为您提供了一种解决方案,即将值解压缩到函数中。更具体地说,将第一个数组值 [True, False] 传递给 x1,并将 [False, False] 传递给 x2:

>>> np.logical_and(*np.equal(a, b))
array([False, False], dtype=bool)

【讨论】:

    【解决方案3】:

    这样的事情怎么样:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 2019-02-06
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      • 2019-07-04
      • 2013-09-17
      相关资源
      最近更新 更多