Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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 多幅图像与一幅基础图像之间的欧氏距离_Python_Arrays_Matrix_Numpy - Fatal编程技术网

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)