Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中数组的成对减法_Python_Numpy_Knn - Fatal编程技术网

python中数组的成对减法

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]

我有两个矩阵,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] - 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,:]
这为我节省了很多编写代码的时间。非常感谢。