Ada*_*che 2 python numpy distance python-3.x
我有两个 numpy 数组 A 和 B。A 的形状是 (m,3),B 的形状是 (n, 3)。
这些矩阵看起来像这样:
A
#output
array([[ 9.227, -4.698, -95.607],
[ 10.294, -4.659, -94.606],
[ 11.184, -5.906, -94.675],
...,
[ 19.538, -91.572, -45.361],
[ 20.001, -92.655, -45.009],
[ 19.271, -92.726, -45.79 ]])
Run Code Online (Sandbox Code Playgroud)
所以它包含每一行的坐标 x,y,z 一个 3D 点。B 遵循相同的格式。
我有这个功能(np 是 numpy):
def compute_dist(point1, point2):
squared = (point1-point2)**2
return (np.sqrt(np.sum(squares)))
Run Code Online (Sandbox Code Playgroud)
我想使用矢量化函数计算 A 和 B 之间的成对距离。
我试试这个:
v = np.vectorize(compute_dist)
v(A, B)
#output
matrix([[37.442, 42.693, 72.705],
[37.442, 42.693, 72.705],
[37.442, 42.693, 72.705],
...,
[37.442, 42.693, 72.705],
[37.442, 42.693, 72.705],
[37.442, 42.693, 72.705]])
Run Code Online (Sandbox Code Playgroud)
即使我阅读了文档,我也不明白如何使用矢量化。如何计算包含 A 和 B 之间成对距离的矩阵?我知道有scipy.distance.cdist但我想用np.vectorize自己做。
我不关心输出的格式(列表、数组、矩阵……)。最后我只想找到最小距离。
您可以使用np.newaxis来扩展两个数组的维度A并B启用广播,然后进行计算。
成对距离意味着 中的每个点都A (m, 3)应该与 中的每个点进行比较B (n, 3)。这导致(m, n)距离矩阵。使用 numpy 可以使用广播来实现想要的结果。通过使用A=A[:, np.newaxis, :]和B=B[np.newaxis, :, :]产生的形状A (m, 1, 3)和B(1, n, 3)respectivley。如果然后执行像C = A-Bnumpy 自动广播这样的计算。这意味着您将获得 B 的所有 n 列的 A 的所有 m 行的副本,以及 A 的所有 m 行的 B 的所有 n 列的副本。
A (m, 1, 3)
- B (1, n, 3)
--------------
= C (m, n, 3)
Run Code Online (Sandbox Code Playgroud)
要获得距离矩阵,您可以使用numpy.linalg.norm():
import numpy as np
m = 10
n = 12
A = np.random.random((m, 3))
B = np.random.random((n, 3))
# Add newaxis on second axis of A and on first axis on B
# shape: (m, n, 3) = (m, 1, 3) - (1, n, 3)
C = A[:, np.newaxis, :] - B[np.newaxis, :, :]
C = np.linalg.norm(C, axis=-1)
# shape: (m, n)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
477 次 |
| 最近记录: |