Python 如何将np.apply_沿_轴应用于两个数组的组合?

Python 如何将np.apply_沿_轴应用于两个数组的组合?,python,numpy,Python,Numpy,给出了对象标签的数组以及到该对象的距离。我想应用knn来寻找预测的标签。我想用np.bincount来做这个。然而,我不明白如何使用这个。 看一些例子 labels = [[1,1,2,0,0,3,3,3,5,1,3], [1,1,2,0,0,3,3,3,5,1,3]] weights= [[0,0,0,0,0,0,0,0,1,0,0], [0,0,0,0,0,0,0,0,1,0,0]] 想象一下,上面给出了两个对象的10个最近邻,并给出了它们的标签

给出了对象标签的数组以及到该对象的距离。我想应用knn来寻找预测的标签。我想用
np.bincount
来做这个。然而,我不明白如何使用这个。 看一些例子

labels = [[1,1,2,0,0,3,3,3,5,1,3],
          [1,1,2,0,0,3,3,3,5,1,3]]

weights= [[0,0,0,0,0,0,0,0,1,0,0],
          [0,0,0,0,0,0,0,0,1,0,0]]

想象一下,上面给出了两个对象的10个最近邻,并给出了它们的标签和距离。因此,我希望输出为
[5,5]
,因为只有具有该标签的邻居具有非零权重。我正在做下一件事:

eps = 1e-5
lab_weight = np.array(list(zip(labels, weights)))
predict = np.apply_along_axis(lambda x: np.bincount(x[0], weights=x[1]).argmax(), 2, lab_weight)

我预计
x
将对应于
[[1,1,2,0,0,3,3,3,5,1,3],[0,0,0,0,0,0,0,0,1,0]
,但它不会。其他轴参数也不起作用。我怎样才能达到目标?我想使用
numpy
函数并避免python循环。

代码的问题是您试图使用 函数用于阵列的2-D切片,而沿\u轴应用\u 将给定函数应用于1-D切片

因此,您的代码会生成一个异常:ValueError:object of too small 所需阵列的深度

要将函数应用于二维切片,请使用基于 np.rollaxis,然后从中创建Numpy数组:

result = np.array([ np.bincount(x[0], weights=x[1]).argmax()
    for x in np.rollaxis(lab_weight, 2) ])
对于您的阵列,结果是:

array([1, 1, 2, 0, 0, 3, 3, 3, 5, 1, 3], dtype=int64)
要跟踪每个交互的源数组,请执行中间结果 最后的结果是运行:

i = 0
for x in np.rollaxis(lab_weight, 2):
    print(f'  i: {i}\n{x}'); i += 1
    bc = np.bincount(x[0], weights=x[1])
    bcm = bc.argmax()
    print(bc, bcm)

下一个解决方案为我提供了理想的结果:


labels = [[1,1,2,0,0,3,3,3,5,1,3],
          [1,1,2,0,0,3,3,3,5,1,3]]

weights= [[0,0,0,0,0,0,0,0,1,0,0],
          [0,0,0,0,0,0,0,0,1,0,0]]
length = len(labels[0])
lab_weight = np.hstack((labels, weights))
predict = np.apply_along_axis(lambda x: np.bincount(x[:length], weights=x[length:]).argmax(), 1, lab_weight)

你没有。它是一个迭代一个数组的函数<代码>应用无法避免这些循环。那它就藏起来了