将numpy数组映射到网格

时间:2018-03-22 10:16:49

标签: python arrays performance numpy

数据已存储在带有3个索引(对应于空间坐标)的numpy.array中。为了将其传递给某个python模块,需要重新组织(并重新整形)数据数组以对应于坐标数组,例如,应该只有一个索引对应于3d(空间)矢量。我得到了它的工作,但它很慢(我可能有一个数组大小100 ^ 3而不是像MWE中的10 ^ 3)。如果可能的话,我希望得到关于如何加速(显着)的建议的MWE:

import com.typesafe.config.ConfigFactory

1 个答案:

答案 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]