Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Numpy 具有类矩阵输出的一维阵列上的成对计算_Numpy_Numpy Ndarray - Fatal编程技术网

Numpy 具有类矩阵输出的一维阵列上的成对计算

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循环,但我觉得有更好的方法,我似乎

假设您拥有以下1D阵列:

数组([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
。是的,但我希望它在对角线的两侧都输出实际结果。当事情变得棘手时,可能会出现各种各样的迹象。