我有两个向量,我想构造一个它们的成对差的矩阵。目前我这样做:
import numpy as np
a = np.array([1,2,3,4])
b = np.array([3,2,1])
M = a.reshape((-1,1)) - b.reshape((1,-1))
这当然有效,但我想知道这是否真的是做事情的预期方式。这一行的可读性不够理想;人们必须思考一下reshape
在做什么。这种情况可以改善吗?还有其他"清洁工"吗?实现相同目标的方法?
有一种有效的方法可以做到这一点,不需要您手动重塑,使用numpy
的ufunc
(通用函数)特征。每个ufunc
,包括np.subtract
,都有一个叫做outer
的方法,它可以做你想做的事情。(文档)
outer
将计算(在本例中为np.subtract
)应用于所有对。
>>> import numpy as np
>>> a = np.array([1,2,3,4])
>>> b = np.array([3,2,1])
>>> M = np.subtract.outer(a, b)
>>> M
array([[-2, -1, 0],
[-1, 0, 1],
[ 0, 1, 2],
[ 1, 2, 3]])
>>>
让我们确认一下是否符合您的预期结果。
>>> # This is how `M` was defined in the question:
>>> M = a.reshape((-1,1)) - b.reshape((1,-1))
>>> M
array([[-2, -1, 0],
[-1, 0, 1],
[ 0, 1, 2],
[ 1, 2, 3]])