在Python

时间:2015-11-13 15:48:33

标签: python arrays numpy processing-efficiency

我试图找到一个700x700的python numpy数组中的标记,以便在单独的数组中找到具有相同索引的数字。我正在循环这么多次,所以它花了很长时间,我想知道是否有更快的方法来做到这一点。到目前为止,这就是我所拥有的:

我的lat_endlon_end是我在temp_mask数组中找到的索引。

掩码正在我的700x700阵列上创建一个足迹,其环大小定义了我想要足迹的大小。 mask_index找到temp_mask等于1的位置,因此我可以通过执行以下操作找到单独数组的标记:other_array[footprint_index]。然后,这将为我提供temp_mask的足迹中的other_array的值。

def foot_mask(lat_end,lon_end):
    mask = footprint.footprint(ring_size,ring_size,700,700, 0)
    temp_mask = np.roll(np.roll(mask,lat_end,axis = 0),lon_end, axis = 1)
    mask_index = np.where(temp_mask == 1)
    return mask_index

谢谢!

1 个答案:

答案 0 :(得分:0)

因为你想为多次迭代调用这个函数并且它已经使用了有效的Numpy函数,我认为关键是尽可能多地移动任何循环之外的代码。这意味着当前函数foot_mask不能按原样使用,但应该重构一点。

我并不完全清楚你打算如何在循环中调用你的函数,但基本上我建议你编写这样的代码:

for ring_size in ring_sizes:
    mask = footprint.footprint(ring_size,ring_size,700,700, 0)
    I, J = np.where(mask == 1)

    for lat_end, lon_end in data:  # Or some other loop(s)
        mask_index = ((I + lat_end) % 700, (J + lon_end) % 700)
        # Then use `mask_index` as desired

这样可以减少对footprint.footprintnumpy.where的调用,代码应该运行得更快。此外,对numpy.roll的调用已被取代指数的模数所取代。

如果没有更多信息,如何准确地组织循环以及加速的大小很难说。