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