假设您具有以下一维数组:
array([1,2,3,4,5])
我想在每个数字组合(例如加法,减法等)之间执行不同(简单)的计算,从而得出矩阵类型的输出(不重复),即对于上述数组,输出应为如果我们想计算成对差异,则如下所示:
array([0,-,-,-,-],
[1,0,-,-,-],
[2,1,0,-,-],
[3,2,1,0,-],
[4,3,2,1,0])
当然可以用蛮力将两个for循环一起使用,但我觉得有更好的方法,我似乎找不到正确的方法。
答案 0 :(得分:1)
利用numpy广播计算成对差异。这样就不需要循环。为此,必须在同一数组的行向量和列向量之间进行操作。
import numpy as np
x = np.arange(1,6, dtype=np.float)
# x[:,None] adds a second axis to the array
mat = x[:,None]-x
这将产生:
array([[ 0., -1., -2., -3., -4.],
[ 1., 0., -1., -2., -3.],
[ 2., 1., 0., -1., -2.],
[ 3., 2., 1., 0., -1.],
[ 4., 3., 2., 1., 0.]])
答案 1 :(得分:0)
对于感兴趣的人,我设法使用了scikit-learn的pairwise_distances找到了解决方案。默认情况下,这将只计算任何一对之间的绝对距离,但是可以提供一个自定义函数,该函数带有两个参数,即一对中的两个数字,以进行更精细的计算。一维阵列将需要稍作调整。
from sklearn.metrics import pairwise_distances
def custom_calc(x,y):
return (y-x)
a = np.array([1,2,3,4,5])
matrix = pairwise_distances(a.reshape(-1,1), metric=custom_calc)
matrix
如下所示:
array([[0., 1., 2., 3., 4.],
[1., 0., 1., 2., 3.],
[2., 1., 0., 1., 2.],
[3., 2., 1., 0., 1.],
[4., 3., 2., 1., 0.]])