Numpy 具有类矩阵输出的一维阵列上的成对计算
假设您拥有以下1D阵列:Numpy 具有类矩阵输出的一维阵列上的成对计算,numpy,numpy-ndarray,Numpy,Numpy Ndarray,假设您拥有以下1D阵列: 数组([1,2,3,4,5]) 我希望在每个数字组合(如加法、减法等)之间执行不同(简单)的计算,从而产生矩阵类型的输出(无重复),即对于上述数组,如果我们想要计算两两差,则输出应如下所示: array([0,-,-,-,-], [1,0,-,-,-], [2,1,0,-,-], [3,2,1,0,-], [4,3,2,1,0]) 当然,可以使用蛮力和两个for循环,但我觉得有更好的方法,我似乎
数组([1,2,3,4,5])
我希望在每个数字组合(如加法、减法等)之间执行不同(简单)的计算,从而产生矩阵类型的输出(无重复),即对于上述数组,如果我们想要计算两两差,则输出应如下所示:
array([0,-,-,-,-],
[1,0,-,-,-],
[2,1,0,-,-],
[3,2,1,0,-],
[4,3,2,1,0])
当然,可以使用蛮力和两个for循环,但我觉得有更好的方法,我似乎找不到正确的方法。利用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.]])
利用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.]])
对于任何感兴趣的人,我设法利用scikit learn的成对距离找到了一个解决方案。默认情况下,这将只计算任意对之间的绝对距离,但可以提供一个自定义函数,该函数接受两个参数,即一对中的两个数字,以便进行更详细的计算。对于1D阵列,需要进行轻微的整形
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)
矩阵
如下所示:
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.]])
对于任何感兴趣的人,我设法利用scikit learn的成对距离找到了一个解决方案。默认情况下,这将只计算任意对之间的绝对距离,但可以提供一个自定义函数,该函数接受两个参数,即一对中的两个数字,以便进行更详细的计算。对于1D阵列,需要进行轻微的整形
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)
矩阵
如下所示:
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.]])
那么,对于矩阵输出,在上对角线位置必须填写什么?那么,对于矩阵输出,在上对角线位置必须填写什么?谢谢。但是,矩阵应该是对称的,因此对角线的右侧也应该是正的。您可以对结果数组调用
np.abs
。是的,但我希望它在对角线的两侧都输出实际结果。可能会有混合的迹象,这是当它变得棘手。谢谢。但是,矩阵应该是对称的,因此对角线的右侧也应该是正的。您可以对结果数组调用np.abs
。是的,但我希望它在对角线的两侧都输出实际结果。当事情变得棘手时,可能会出现各种各样的迹象。