gpt4 book ai didi

python - 在 numpy 中按无循环的类标签求和

转载 作者:行者123 更新时间:2023-11-28 22:46:19 24 4
gpt4 key购买 nike

我有一个矩阵,表示到一组点的 k 最近邻点的距离,并且有一个最近邻居的类标签矩阵。 (都是N×k矩阵)

没有显式 python 循环的最佳方法是什么(实际上,我想在那些循环不起作用的 theano 中实现它)来构建一个 (N-by-#classes) 矩阵,其 (i,j) 元素将是从第 i 个点到它的 k-NN 个点的距离之和,类标签为“j”?

例子:

# N = 2
# k = 5
# number of classes = 3

K_val = np.array([[1,2,3,4,6],
[2,4,5,5,7]])

l_val = np.array([[0,1,2,0,1],
[2,0,1,2,0]])

"""
result -> [[5,8,3],
[11,5,7]]
"""

最佳答案

你可以用 numpy.bincount .它有一个 weights 参数,它允许您计算 l_val 中的项目但根据 K_val 对项目进行加权。

唯一的小问题是 K_vall_val 的每一行似乎都是独立处理的。因此,向 l_val 添加一个 shift,这样每一行的值都与其他行不同。


import numpy as np

num_classes = 3
K_val = np.array([[1,2,3,4,6],
[2,4,5,5,7]])

l_val = np.array([[0,1,2,0,1],
[2,0,1,2,0]])

def label_distance(l_val, K_val):
nrows, ncols = l_val.shape
shift = (np.arange(nrows)*num_classes)[:, np.newaxis]
result = (np.bincount((l_val+shift).ravel(), weights=K_val.ravel(),
minlength=num_classes*nrows)
.reshape(nrows, num_classes))
return result


print(label_distance(l_val, K_val))

产量

[[  5.   8.   3.]
[ 11. 5. 7.]]

虽然senderle的方法确实很优雅,但是使用bincount更快:

def using_extradim(l_val, K_val): 
return (K_val[:,:,None] * (l_val[:,:,None] == numpy.arange(3)[None,None,:])).sum(axis=1)

In [34]: K2 = np.tile(K_val, (1000,1))

In [35]: L2 = np.tile(l_val, (1000,1))

In [36]: %timeit using_extradim(L2, K2)
1000 loops, best of 3: 584 µs per loop

In [40]: %timeit label_distance(L2, K2)
10000 loops, best of 3: 67.7 µs per loop

关于python - 在 numpy 中按无循环的类标签求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27652328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com