3

我想使用类似np.dotor 的东西(最好)np.einsum来有效地执行它们的相同功能,但使用替代ufunc而不是np.multiply. 例如,考虑这两个数组:

>>> a
array([[0, 1],
       [1, 1],
       [1, 0]])
>>> b
array([[0, 0],
       [1, 0],
       [1, 0],
       [0, 0]])

现在假设我想计算每行中的元素数a等于b. 我希望能够执行以下等效操作(注意:下面的输出是捏造的,但值是我希望看到的):

>>> np.dot(a, b.T, ufunc=np.equal)
array([[1, 0, 0, 1],
       [0, 1, 1, 0],
       [1, 2, 2, 1]])

有没有办法做到这一点?

4

3 回答 3

3

您可以将 Divakar 答案中的广播与numexpr一起使用:

numexpr.evaluate('sum(1*(a == b), axis=2)', {'a': a[:,None]})

1*()一种解决方法。我已经确认这不会分配一个大的临时数组。

于 2016-10-31T23:42:47.180 回答
2

您可以broadcasting用于此类匹配计数问题 -

(a[:,None] == b).sum(2)

样品运行 -

In [36]: a
Out[36]: 
array([[0, 1],
       [1, 1],
       [1, 0]])

In [37]: b
Out[37]: 
array([[0, 0],
       [1, 0],
       [1, 0],
       [0, 0]])

In [38]: (a[:,None] == b).sum(2)
Out[38]: 
array([[1, 0, 0, 1],
       [0, 1, 1, 0],
       [1, 2, 2, 1]])

如果你真的想使用np.einsumand np.equal,这里有一种方法可以塑造早期的方法来给我们想要的结果 -

np.einsum('ijk->ij',np.equal(a[:,None],b).astype(int))
于 2016-10-31T21:31:15.277 回答
1

numpy github上有一个老问题,要求对其进行概括einsum,以允许使用其他功能。当前版本只是实现了产品的总和。据我所知,没有人接手这个项目。

几年前einsum,我修补了 '...' 符号的处理。所以我很清楚它是如何实现的;并且可能会调整我的 Python/cython 模拟器以添加此功能。实际einsum代码是用c.

我的猜测是,如果您不喜欢 Divakar 的方法,则必须使用cython.

于 2016-10-31T22:48:46.023 回答