几个图像和一个基本图像之间的欧几里德距离

时间:2013-04-17 19:07:26

标签: python arrays matrix numpy

我有尺寸X的矩阵(30x8100)和尺寸Y的另一个(1x8100)。我想生成一个包含它们之间差异的数组(X[1]-Y, X[2]-Y,..., X[30]-Y) 有人可以帮忙吗?

4 个答案:

答案 0 :(得分:3)

您需要的只是

X - Y

由于有几个人提供了似乎试图使形状与手动匹配的答案,我应该解释一下:
Numpy将自动展开Y的形状,使其与X的形状匹配。这称为broadcasting,它通常可以很好地猜测应该做什么。在不明确的情况下,可以应用axis关键字来告诉它执行哪个方向。在这里,由于Y的维度长度为1,因此该轴的展开长度为30,以匹配X的形状。

例如,

In [87]: import numpy as np

In [88]: n, m = 3, 5

In [89]: x = np.arange(n*m).reshape(n,m)

In [90]: y = np.arange(m)[None,...]

In [91]: x.shape
Out[91]: (3, 5)

In [92]: y.shape
Out[92]: (1, 5)

In [93]: (x-y).shape
Out[93]: (3, 5)

In [106]: x
Out[106]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

In [107]: y
Out[107]: array([[0, 1, 2, 3, 4]])

In [108]: x-y
Out[108]: 
array([[ 0,  0,  0,  0,  0],
       [ 5,  5,  5,  5,  5],
       [10, 10, 10, 10, 10]])

但这并不是真正的欧几里德距离,因为你的标题似乎表明你想要:

df = np.asarray(x - y)                # the difference between the images
dst = np.sqrt(np.sum(df**2, axis=1))  # their euclidean distances

答案 1 :(得分:1)

使用array并使用numpy广播,以便从Y中删除

初始化矩阵:

>>> from numpy import *
>>> a = array([[1,2,3],[4,5,6]])

访问a中的第二行:

>>> a[1]
array([4, 5, 6])

Y

减去数组
>>> Y = array([3,9,0])
>>> a - Y

array([[-2, -7,  3],
       [ 1, -4,  6]])

答案 2 :(得分:1)

只需迭代numpy数组中的行,你实际上只需减去它们,numpy会创建一个带有差异的新数组!

import numpy as np
final_array = []
#X is a numpy array that is 30X8100 and Y is a numpy array that is 1X8100
for row in X:
    output = row - Y
    final_array.append(output)

输出将是你得到的X [0] - Y,X [1] - Y等数组。现在你的final_array将是一个内部有30个数组的数组,每个数组都有你需要的X-Y值!就那么简单。只需确保首先将矩阵转换为numpy数组

编辑:由于numpy广播会进行迭代,所以只要你拥有两个数组就需要一行:

final_array = X - Y

然后那是你的阵列与差异!

答案 3 :(得分:0)

a1 = numpy.array(X) #make sure you have a numpy array like [[1,2,3],[4,5,6],...]
a2 = numpy.array(Y) #make sure you have a 1d numpy array like [1,2,3,...]
a2 = [a2] * len(a1[0]) #make a2 as wide as a1
a2 = numpy.array(zip(*a2)) #transpose it (a2 is now same shape as a1)

print a1-a2 #idiomatic difference between a1 and a2 (or X and Y)