Python 多幅图像与一幅基础图像之间的欧氏距离
我有一个维度的矩阵Python 多幅图像与一幅基础图像之间的欧氏距离,python,arrays,matrix,numpy,Python,Arrays,Matrix,Numpy,我有一个维度的矩阵X(30x8100),还有一个维度的矩阵Y(1x8100)。我想生成一个数组,其中包含它们之间的差异(X[1]-Y,X[2]-Y,…,X[30]-Y) 有人能帮忙吗?你所需要的就是 X - Y 由于有几个人提供的答案似乎试图手动匹配形状,我应该解释: Numpy将自动展开Y的形状,使其与X的形状相匹配。这就是所谓的,它通常能很好地猜测应该做什么。在不明确的情况下,可以应用axis关键字来告诉它做事情的方向。这里,由于Y的尺寸为长度1,这是扩展为长度30的轴,以匹配X的形状 比
X
(30x8100),还有一个维度的矩阵Y
(1x8100)。我想生成一个数组,其中包含它们之间的差异(X[1]-Y,X[2]-Y,…,X[30]-Y)
有人能帮忙吗?你所需要的就是
X - Y
由于有几个人提供的答案似乎试图手动匹配形状,我应该解释:Numpy将自动展开
Y
的形状,使其与X
的形状相匹配。这就是所谓的,它通常能很好地猜测应该做什么。在不明确的情况下,可以应用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
你所需要的就是
X - Y
由于有几个人提供的答案似乎试图手动匹配形状,我应该解释:Numpy将自动展开
Y
的形状,使其与X
的形状相匹配。这就是所谓的,它通常能很好地猜测应该做什么。在不明确的情况下,可以应用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
使用
array
和numpy
broadcasting从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]])
使用
array
和numpy
broadcasting从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]])
只需迭代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等数组。现在,最终的_数组将是一个包含30个数组的数组,每个数组都具有所需的X-Y值!就这么简单。只需确保首先将矩阵转换为numpy数组
编辑:由于numpy广播将进行迭代,因此一旦拥有两个阵列,您只需一行即可:
final_array = X - Y
然后这就是你们的差异数组 只需迭代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等数组。现在,最终的_数组将是一个包含30个数组的数组,每个数组都具有所需的X-Y值!就这么简单。只需确保首先将矩阵转换为numpy数组
编辑:由于numpy广播将进行迭代,因此一旦拥有两个阵列,您只需一行即可:
final_array = X - Y
然后这就是你们的差异数组 我得到了
ValueError:输入必须是一个正方形数组
@user222953哦,因为你的x
和y
有类型矩阵
,请使用np.asarray
,这样平方将是按元素的,请参阅我的编辑。谢谢!但结果是有线的<代码>dst[ 11368.09117391 7238.28732897 5975.85568237 6516.33956578 4690.22604361 4727.27377993 5210.6757694 4917.37040654 4315.19124481 4351.23160123 4219.13923247 4003.55476258 4175.54212706 4102.91009999 4330.4599796 4184.70386037 4134.89623796 4162.12512307 3828.49532333 3930.67847956 3766.93023507 3666.34224248 4040.05576148 3848.65880709 3845.355773393 3869.77351631 3836.28039808 3801.06876888 3799.32736535 3646.77473834]@user222953您还有其他想法吗?dst
的形状是(30,)
,因为这是每个图像与基础图像的不同程度。该“距离”的单位基本上是像素亮度(假设灰度图像)。然后,dst[i]
说明图像的亮度与基础(输入?)图像的不同程度。查找imin=argmin(dst)
将显示图像[imin]
是与输入图像最相似的图像。好吧,与我们的眼睛相似(可能对于您的应用而言)不一定与欧几里德距离中最近的图像相同。欧几里德距离比较给定位置的每个像素,如,image1[i,j]
与image2[i,j]进行比较
。欧几里德距离中的“最近”图像是所有这些比较的总和最小的图像。请注意,相同的图像,旋转一点,从这个意义上讲,可能离它本身非常“远”。我得到了ValueError:输入必须是一个方形数组
@user222953哦,因为您的x
和y
没有键入matrix
,使用np.asarray
,以便按元素进行平方运算,请参见我的编辑。谢谢!但结果已连线!dst[ 11368.09117391 7238.28732897 5975.85568237 6516.33956578 4690.22604361 4727.27377993 5210.6757694 4917.37040654 4315.19124481 4351.23160123 4219.13923247 4003.55476258 4175.54212706 4102.91009999 4330.4599796 4184.70386037 4134.89623796 4162.12512307 3828.49532333 3930.67847956 3766.93023507 3666.34224248 4040.05576148 3848.65880709 3845.35577393 3869.77351631 3836.28039808 3801.06876888 3799.32736535 3646.77473834]
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)