Python 如何将np.apply_沿_轴应用于两个数组的组合?
给出了对象标签的数组以及到该对象的距离。我想应用knn来寻找预测的标签。我想用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个最近邻,并给出了它们的标签
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)
你没有。它是一个迭代一个数组的函数<代码>应用无法避免这些循环。那它就藏起来了