在下面的代码中,我们计算所有给定点对之间的向量的大小。为了加快NumPy中的这个操作,我们可以使用广播
import numpy as np
points = np.random.rand(10,3)
pair_vectors = points[:,np.newaxis,:] - points[np.newaxis,:,:]
pair_dists = np.linalg.norm(pair_vectors,axis=2).shape
或外部产品迭代
it = np.nditer([points,points,None], flags=['external_loop'], op_axes=[[0,-1,1],[-1,0,1],None])
for a,b,c in it:
c[...] = b - a
pair_vectors = it.operands[2]
pair_dists = np.linalg.norm(pair_vectors,axis=2)
我的问题是如何使用广播或外部产品迭代来创建一个形式为10x10x6的数组,其中最后一个轴包含一对(扩展名)中两个点的坐标。并且以相关的方式,是否可以直接使用广播或外积迭代计算对距离,即在不首先计算差向量(减少)的情况下产生10x10形式的矩阵。
为了澄清,下面的代码使用慢循环创建了所需的矩阵。
pair_coords = np.zeros(10,10,6)
pair_dists = np.zeros(10,10)
for i in range(10):
for j in range(10):
pair_coords[i,j,0:3] = points[i,:]
pair_coords[i,j,3:6] = points[j,:]
pair_dists[i,j] = np.linalg.norm(points[i,:]-points[j,:])
这是尝试使用外部产品迭代计算distanced(或应用任何其他函数,这些函数在一对中获取两个点的6个坐标并生成标量)。
res = np.zeros((10,10))
it = np.nditer([points,points,res], flags=['reduce_ok','external_loop'], op_axes=[[0,-1,1],[-1,0,1],None])
for a,b,c in it: c[...] = np.linalg.norm(b-a)
pair_dists = it.operands[2]
答案 0 :(得分:1)
这是一种以矢量化方式生成这些数组的方法 -
from itertools import product
from scipy.spatial.distance import pdist, squareform
N = points.shape[0]
# Get indices for selecting rows off points array and stacking them
idx = np.array(list(product(range(N),repeat=2)))
p_coords = np.column_stack((points[idx[:,0]],points[idx[:,1]])).reshape(N,N,6)
# Get the distances for upper triangular elements.
# Then create a symmetric one for the final dists array.
p_dists = squareform(pdist(points))
在this post
中讨论了很少的其他矢量化方法,所以也看一下!