【发布时间】:2018-09-27 21:59:38
【问题描述】:
我有一个带有shape = (500, 500) 的二维数据集。从给定位置(x_0, y_0) 我想将每个元素/像素的距离映射到给定位置。我通过确定与(x_0, y_0) 的所有唯一距离并使用整数映射它们来做到这一点。 6 x 6 数据集的这种映射如下所示:
[9 8 7 6 7 8]
[8 5 4 3 4 5]
[7 4 2 1 2 4]
[6 3 1 0 1 3]
[7 4 2 1 2 4]
[8 5 4 3 4 5]
其中整数对应于存储在以下数组中的唯一距离:
[0. 1. 1.41421356 2. 2.23606798 2.82842712 3. 3.16227766 3.60555128 4.24264069]
确定这些距离的代码如下:
def func(data, (x_0,y_0)):
y, x = numpy.indices((data.shape))
r = numpy.sqrt((x - x_0)**2 + (y - y_0)**2)
float_values = numpy.unique(r.ravel()) # Unique already sorts the result
int_values = numpy.arange(float_values.shape[0]).astype(numpy.int)
for idx in range(float_values.shape[0])[::-1]:
r[r == float_values[idx]] = int_values[idx]
return float_values, r
for 循环是一个瓶颈。我需要的应用程序需要很长时间。有没有办法加快/提高其性能?或者是否有一种完全不同但更快的方法来获得我需要的输出?
【问题讨论】:
-
您真的需要整个索引方案,还是只存储实际距离就可以了。当然你会牺牲一点空间,但谁真正在乎呢?
-
或者,您是否愿意计算一个中心为零的(对称)999x999 数组,然后对其进行索引?
-
另外,
np.unique有一个return_inverse参数,您可以使用它直接获取索引。但是unique是一项昂贵的操作,您应该尽量避免这样做。
标签: python performance numpy optimization