Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.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
Python 如何在numpy中获得3x3x3数组上的欧氏距离_Python_Matrix_Numpy_Scipy_Linear Algebra - Fatal编程技术网

Python 如何在numpy中获得3x3x3数组上的欧氏距离

Python 如何在numpy中获得3x3x3数组上的欧氏距离,python,matrix,numpy,scipy,linear-algebra,Python,Matrix,Numpy,Scipy,Linear Algebra,假设我有一个这样的(3,3,3)数组 array([[[1, 1, 1], [1, 1, 1], [0, 0, 0]], [[2, 2, 2], [2, 2, 2], [2, 2, 2]], [[3, 3, 3], [3, 3, 3], [1, 1, 1]]]) 如何得到对应于3个值的每个向量与第0个值之间的欧几里德距离的9个值 例如做一个numpy.linalg.n

假设我有一个这样的(3,3,3)数组

array([[[1, 1, 1],
        [1, 1, 1],
        [0, 0, 0]],

       [[2, 2, 2],
        [2, 2, 2],
        [2, 2, 2]],

       [[3, 3, 3],
        [3, 3, 3],
        [1, 1, 1]]])
如何得到对应于3个值的每个向量与第0个值之间的欧几里德距离的9个值

例如做一个
numpy.linalg.norm([1,1,1]-[1,1,1])
2次,然后做
norm([0,0,0]-[0,0,0])
,然后做
norm([2,2,2,2]-[1,1,1])
2次,
norm([2,2,2]-[0,0])
,然后做
norm([3,3,3]-[1,1])
2次,最后做
norm([1,0,0])

有什么好方法可以矢量化这个吗?我想把距离存储在(3,3,1)矩阵中

结果将是:

array([[[0. ],
        [0. ],
        [0. ]],

       [[1.73],
        [1.73],
        [3.46]]

       [[3.46],
        [3.46],
        [1.73]]])

您可能需要考虑,它有效地计算两个输入集合中的点对之间的距离(包括标准欧几里得度量,等等)。下面是示例代码:

import numpy as np
import scipy.spatial.distance as dist

i = np.array([[[1, 1, 1],
               [1, 1, 1],
               [0, 0, 0]],
              [[2, 2, 2],
               [2, 2, 2],
               [2, 2, 2]],
              [[3, 3, 3],
               [3, 3, 3],
               [1, 1, 1]]])
n,m,o = i.shape

# compute euclidean distances of each vector to the origin
# reshape input array to 2-D, as required by cdist
# only keep diagonal, as cdist computes all pairwise distances
# reshape result, adapting it to input array and required output
d = dist.cdist(i.reshape(n*m,o),i[0]).reshape(n,m,o).diagonal(axis1=2).reshape(n,m,1)
d
适用于:

array([[[ 0.        ],
        [ 0.        ],
        [ 0.        ]],

       [[ 1.73205081],
        [ 1.73205081],
        [ 3.46410162]],

       [[ 3.46410162],
        [ 3.46410162],
        [ 1.73205081]]])

这种方法的最大警告是,我们正在计算
n*m*o
距离,而我们只需要
n*m
(这涉及到大量的重塑)

keepdims
参数添加到numpy 1.7中,您可以使用它来保持总和轴:

np.sum((x - [1, 1, 1])**2, axis=-1, keepdims=True)**0.5
结果是:

[[[ 0.        ]
  [ 0.        ]
  [ 0.        ]]

 [[ 1.73205081]
  [ 1.73205081]
  [ 1.73205081]]

 [[ 3.46410162]
  [ 3.46410162]
  [ 0.        ]]]
array([[[ 0.        ],
        [ 0.        ],
        [ 0.        ]],

       [[ 1.73205081],
        [ 1.73205081],
        [ 3.46410162]],

       [[ 3.46410162],
        [ 3.46410162],
        [ 1.73205081]]])
编辑

np.sum((x - x[0])**2, axis=-1, keepdims=True)**0.5
结果是:

[[[ 0.        ]
  [ 0.        ]
  [ 0.        ]]

 [[ 1.73205081]
  [ 1.73205081]
  [ 1.73205081]]

 [[ 3.46410162]
  [ 3.46410162]
  [ 0.        ]]]
array([[[ 0.        ],
        [ 0.        ],
        [ 0.        ]],

       [[ 1.73205081],
        [ 1.73205081],
        [ 3.46410162]],

       [[ 3.46410162],
        [ 3.46410162],
        [ 1.73205081]]])

我正在做一些类似的事情,即计算视频卷中每对帧的平方距离之和(SSD)。我想这可能对你有帮助

视频卷是单个4d numpy阵列。此数组应具有维度 (时间、行、列、3)和数据类型np.uint8

输出是一个dtype float的正方形2d numpy数组。输出[i,j]应包含 帧i和j之间的SSD

video_volume = video_volume.astype(float)
size_t = video_volume.shape[0]
output = np.zeros((size_t, size_t), dtype = np.float)
for i in range(size_t):
    for j in range(size_t):
        output[i, j] = np.square(video_volume[i,:,:,:] - video_volume[j,:,:,:]).sum()

是的,很遗憾,
norm
不允许
arg。我不知道为什么。你可能会在这篇感谢你的帮助的文章中找到你想要的答案。你可能离答案不远了;我编辑了这个问题,以显示我如何需要arr[0]中的第0个值,而不仅仅是arr[0][0]。@chimpsarehungry,我编辑了答案,只需将
[1,1,1]
替换为
x[0]
,您就会得到结果。谢谢,我的也是一个视频。如果可以的话,我想避免这样的循环。@chimpsarehungry:我修改后的答案应该能解决你们的澄清。