数据已存储在带有3个索引(对应于空间坐标)的numpy.array中。为了将其传递给某个python模块,需要重新组织(并重新整形)数据数组以对应于坐标数组,例如,应该只有一个索引对应于3d(空间)矢量。我得到了它的工作,但它很慢(我可能有一个数组大小100 ^ 3而不是像MWE中的10 ^ 3)。如果可能的话,我希望得到关于如何加速(显着)的建议的MWE:
import com.typesafe.config.ConfigFactory
答案 0 :(得分:2)
一种方法是从x,y,z
生成组合网格,然后使用kd-tree based quick nearest-neighbor lookup
追溯索引。因此,我们将有一个矢量化解决方案,如此 -
from itertools import product
from scipy.spatial import cKDTree
# Form all combinations
combs = np.array(list(product(x, y, z)))
# Find closest indices for each pt in coords
closest_idx = cKDTree(combs).query(coords, k=1)[1]
# Index into data array and retrieve the output
data2Out = data.ravel()[closest_idx]
内存节省
我们可以通过分别在三个坐标上使用kd-tree计算来优化内存,从而创建组合创建部分并希望提升性能,如此 -
I = cKDTree(x[:,None]).query(coords[:,[0]], k=1)[1]
J = cKDTree(y[:,None]).query(coords[:,[1]], k=1)[1]
K = cKDTree(z[:,None]).query(coords[:,[2]], k=1)[1]
data2Out = data[I,J,K]