python 中数组的成对减法
pairwise subtraction of arrays in python
我有两个矩阵,形状为 512*3 的 A 和形状为 1024*3 的 B
我想计算它们的行之间的成对减法,所以结果的形状是 512*1024*3
(它们实际上是 3D 点坐标数组:x、y、z,我最终想找到从 B 到 A 中每个点的 k 个最近点)
而且我不能使用 for 循环。有什么 pythonic 方法可以做到这一点吗?
谢谢你
区别:
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]
效率较低但更简单。
来自我在之前评论中链接的参考资料:
http://scipy.github.io/old-wiki/pages/EricsBroadcastingDoc
您正在尝试这样做。
只需按照示例进行操作,如:
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))
我有两个矩阵,形状为 512*3 的 A 和形状为 1024*3 的 B 我想计算它们的行之间的成对减法,所以结果的形状是 512*1024*3
(它们实际上是 3D 点坐标数组:x、y、z,我最终想找到从 B 到 A 中每个点的 k 个最近点)
而且我不能使用 for 循环。有什么 pythonic 方法可以做到这一点吗? 谢谢你
区别:
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]
效率较低但更简单。
来自我在之前评论中链接的参考资料:
http://scipy.github.io/old-wiki/pages/EricsBroadcastingDoc
您正在尝试这样做。
只需按照示例进行操作,如:
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))