python中数组的成对减法
我有两个矩阵,A的形状是512*3,B的形状是1024*3 我想计算它们行之间的两两相减,所以结果的形状是512*1024*3 (它们实际上是3D点坐标的数组:x、y、z,我最终希望找到从B到A中每个点的k个最近点) 我不能用for循环。有什么类似蟒蛇的方法吗? 谢谢你。区别:python中数组的成对减法,python,numpy,knn,Python,Numpy,Knn,我有两个矩阵,A的形状是512*3,B的形状是1024*3 我想计算它们行之间的两两相减,所以结果的形状是512*1024*3 (它们实际上是3D点坐标的数组:x、y、z,我最终希望找到从B到A中每个点的k个最近点) 我不能用for循环。有什么类似蟒蛇的方法吗? 谢谢你。区别: diff = A[:, np.newaxis] - B[np.newaxis, :] 对于A中的每个点,B中最近的k点: k = 5 dists = np.sum(np.square(A[:, np.newaxis]
diff = A[:, np.newaxis] - B[np.newaxis, :]
对于A
中的每个点,B
中最近的k
点:
k = 5
dists = np.sum(np.square(A[:, np.newaxis] - B[np.newaxis, :]), axis=-1)
top_k = np.argpartition(dists, k, axis=1)[:, :k]
不过,top_k
不是按距离排序的。您可以稍后对其进行排序,也可以执行以下操作:
top_k = np.argsort(dists, axis=1)[:, :k]
效率较低但更简单。根据我在上一篇评论中链接的参考: 你正试图这么做 只需按照以下示例进行操作:
import numpy as np
np.random.seed(123)
a = np.random.uniform(size=(8,3)) # or (512,3)
b = np.random.uniform(size=(16,3)) # or (1024,3)
diff = a[np.newaxis,:,:]-b[:,np.newaxis,:]
dist = np.sqrt(np.sum(diff**2,axis=-1))
你能告诉我们到目前为止你在代码方面做了哪些尝试吗?请发布你到目前为止的代码。在其他事情中,这将显示你真正拥有的结构。Python本身没有数组或矩阵结构。支持这些结构的包有
product
或join
方法来执行您想要的迭代。Python有itertools.product
方法。您应该研究A[:,np.newaxis]-B[np.newaxis,:]
这为我节省了很多编写代码的时间。非常感谢。