我有一个X
维度矩阵(30x8100)
和另一个Y
维度矩阵(1x8100)
。我想生成一个包含它们之间差异的数组(X[1]-Y, X[2]-Y,..., X[30]-Y)
有人可以帮忙吗?
问问题
1634 次
4 回答
3
你所需要的只是
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
于 2013-04-17T19:13:20.103 回答
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]])
于 2013-04-17T19:13:21.447 回答
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 个数组的数组,每个数组都有您需要的 XY 值!就那么简单。只需确保先将矩阵转换为 numpy 数组
编辑:由于 numpy 广播将进行迭代,一旦你有两个数组,你只需要一行:
final_array = X - Y
然后就是你的数组有差异!
于 2013-04-17T19:33:46.633 回答
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)
于 2013-04-17T19:14:09.127 回答