【问题标题】:numpy knn with vectorizing nested matrices带有矢量化嵌套矩阵的 numpy knn
【发布时间】:2017-11-07 20:12:59
【问题描述】:

我正在尝试使用 numpy 及其矢量化来实现 KNN 算法。

import numpy as np

A = np.array([[11,12,13], [21,22,23], [31,32,33]])
B = np.array([[41,42,43], [51,52,53], [61,62,63]])
C = np.array([[71,72,73], [81,82,83], [91,92,93]])

X = np.array([A, B, C])

f = lambda a,b: (a-b)**2
np.sqrt(np.vectorize(f)(A, X).reshape(3,9).sum(axis=1))
# array([   0.,   90.,  180.])

如果我这样使用它,我会得到一个所有向量到 A 的距离的 3x1 矩阵。

要获得所有向量之间的所有距离,我需要一个结果矩阵,如下所示:

array([[   0.,   90.,  180.],
       [  90.,    0.,   90.],
       [ 180.,   90.,    0.]])

如何改进操作以获得预期的结果?

【问题讨论】:

  • 使用np.vectorize 有什么意义?没有它,您应该能够对数组进行减法和幂运算。该函数适用于只能用标量表示的复杂函数。
  • 可以用纯python编写KNN算法。然后问如何将其重写为numpy代码。我认为哪个效果更好。

标签: python numpy knn array-broadcasting


【解决方案1】:
In [843]: np.sqrt(f(X[:,None],X).reshape(3,3,9).sum(axis=-1))
Out[843]: 
array([[   0.,   90.,  180.],
       [  90.,    0.,   90.],
       [ 180.,   90.,    0.]])

您不需要vectorizef 直接使用数组。

但是看着

In [841]: f(X[:,None],X).reshape(3,3,9)
Out[841]: 
array([[[   0,    0,    0,    0,    0,    0,    0,    0,    0],
        [ 900,  900,  900,  900,  900,  900,  900,  900,  900],
        [3600, 3600, 3600, 3600, 3600, 3600, 3600, 3600, 3600]],

       [[ 900,  900,  900,  900,  900,  900,  900,  900,  900],
        [   0,    0,    0,    0,    0,    0,    0,    0,    0],
        [ 900,  900,  900,  900,  900,  900,  900,  900,  900]],

       [[3600, 3600, 3600, 3600, 3600, 3600, 3600, 3600, 3600],
        [ 900,  900,  900,  900,  900,  900,  900,  900,  900],
        [   0,    0,    0,    0,    0,    0,    0,    0,    0]]], dtype=int32)

让我怀疑您计算的值超出了需要。但我还没有尝试着看大局。

【讨论】:

  • 非常感谢! Numpy 的索引有时真的很难理解。您对计算的复杂性也是正确的。
猜你喜欢
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 2018-05-24
  • 2017-05-04
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
相关资源
最近更新 更多