4

我刚开始学习一些 numpy,因为高性能计算所有可能组合(n 个列表)的最小二乘差

现在我被计算困住了,可以使用一些帮助。

我有一个如下所示的 numpy 数组对象:

>>> items
array([[ 246, 1143, 1491, ..., 1167,  325, 1158],
       [ 246, 1143, 1491, ..., 1167,  519, 1158],
       [ 246, 1143, 1491, ..., 1167,  507, 1158],
       ..., 
       [1491, 1143,  246, ..., 1167,  325, 1158],
       [1491, 1143,  246, ..., 1167,  519, 1158],
       [1491, 1143,  246, ..., 1167,  507, 1158]])

我想得到他所有成员中具有最小二乘差的数组的数量,一个numpythonic版本:

for num,item in enumerate(items): #Calculate for each list of items
      for n in range(len(item)):
        for i in range(n, len(item)):
          dist += (item[n]-item[i])**2 #Key formula
          if dist>min_dist: #This is a shortcut
              break
          else:
              continue
          break               
      if min_dist is None or dist < min_dist:
        min_dist = dist
        best = num #We get the number of the combination we want

我会很感激任何提示。

4

2 回答 2

1

初始化你的NxM数组:

>>> import numpy as np
>>> items = np.random.random_sample((10,3))

计算每个维向量的所有元素之间的平方N M和,并将结果存储在列表中:

>>> sq = [(np.subtract.outer(item,item) ** 2).sum() for item in items]

求所有元素之间平方和最小的向量的索引:

>>> best_index = np.argmin(sq)

或者,为了避免中间列表:

best = np.inf
best_index = None
for i,item in enumerate(items):
    ls = (np.subtract.outer(item,item) ** 2).sum()
    if ls < best:
        best = ls
        best_index = i
于 2012-12-06T18:54:48.193 回答
0
import numpy as np
[(lambda(x):np.square(np.dot(x,-1*x)))(x) for x in items]
于 2012-12-06T18:42:16.667 回答