1

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

4

4 回答 4

3

你所需要的只是

X - Y

由于有几个人提供了似乎试图手动匹配形状的答案,我应该解释一下:
Numpy 会自动扩展Y的形状,使其与 的形状匹配X。这称为广播,它通常可以很好地猜测应该做什么。在模棱两可的情况下,axis可以应用一个关键字来告诉它往哪个方向做事。在这里,由于Y长度为 1 的维度,即扩展为30X' 形状匹配的长度的轴。

例如,

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 回答