在numpy数组中比较多个值

3

我有一个numpy数组

a = numpy.array([1,2,3,0])

我想要做类似于的事情。
a == numpy.array([0,1,2,3])

并获取

[[False, True,   False, False],
 [False, False,  True,  False],
 [False, False,  False, True ],
 [True,  False,  False, False]]

换句话说,我希望第i列显示a中的每个元素是否等于i。这感觉像是numpy可能会简化的事情。有什么想法吗?
4个回答

6
关键概念是使用广播。
a = numpy.array([1,2,3,0])
b = numpy.array([0,1,2,3])
a[..., None] == b[None, ...]

结果如下:
>>> a[..., None] == b[None, ...]
array([[False,  True, False, False],
       [False, False,  True, False],
       [False, False, False,  True],
       [ True, False, False, False]], dtype=bool)

了解如何使用广播将大大提高您的NumPy代码。 您可以在此处阅读有关它的信息:
请注意,本文档保留HTML标记。

1
你可以将其重塑为向量和协变量并进行比较:
>>> a = numpy.array([1,2,3,0])
>>> b = numpy.array([0,1,2,3])
>>> a.reshape(-1,1) == b.reshape(1,-1)
array([[False,  True, False, False],
       [False, False,  True, False],
       [False, False, False,  True],
       [ True, False, False, False]], dtype=bool)

1
上述是一种方法。另一个可能的方法(尽管我仍然不确定是否有更好的方法)是:
import numpy as np
a = np.array([[1, 2, 3, 0]]).T
b = np.array([[0, 1, 2, 3]])
a == b
array([[False,  True, False, False],
   [False, False,  True, False],
   [False, False, False,  True],
   [ True, False, False, False]], dtype=bool)

我认为你只需要确保一个是列向量,一个是行向量,它就会为你执行比较。


这与上面的答案相同。打败我哈哈,我试图弄清楚格式。如何让箭头显示出来? - cc7768
如果你所说的“箭头”是指REPL的>>>,那么你可以从你的解释器中复制它们。 - mechanical_meat
我理解您的意思,谢谢。我也学到了一个新术语。再次感谢。 - cc7768

0
你可以使用列表推导式来遍历 a 的每个索引,并将该值与 b 进行比较:
>>> import numpy as np
>>> a = np.array([1,2,3,0])
>>> b = np.array([0,1,2,3])
>>> ans = [ list(a[i] == b) for i in range(len(a)) ]
>>> ans
[[False,  True, False, False],
 [False, False,  True, False],
 [False, False, False,  True],
 [ True, False, False, False]]

我通过创建一个列表的列表使输出与您的示例匹配,但您也可以轻松地将您的答案变成一个Numpy数组。


绝对有效。我在想numpy是否有更多内置的功能。这感觉像是库的一部分。 - fgregg

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