Numpy蒙面数组修改

时间:2010-02-21 15:05:05

标签: python numpy masked-array

目前我有一个代码检查数组中的给定元素是否等于= 0,如果是,则将值设置为'level'值(temp_board是2D numpy数组,indices_to_watch包含应该为零监视的2D坐标)。

    indices_to_watch = [(0,1), (1,2)]
    for index in indices_to_watch:
        if temp_board[index] == 0:
            temp_board[index] = level

我想将此转换为更像numpy的方法(删除for并仅使用numpy函数)来加快速度。 这是我试过的:

    masked = np.ma.array(temp_board, mask=(a!=0), hard_mask=True)
    masked.put(indices_to_watch, level)

但不幸的是,当执行put()时需要屏蔽数组需要1D维度(完全奇怪!),是否有其他方法可以更新等于0的数组元素并具有具体索引?

或许使用蒙面数组不是要走的路?

3 个答案:

答案 0 :(得分:1)

我不确定我是否遵循了您问题中的所有细节。如果我理解正确,那么这似乎是直截了当的Numpy索引。下面的代码检查数组(A)是否为​​零,并在找到它们的位置,用'level'替换它们。

import numpy as NP
A = NP.random.randint(0, 10, 20).reshape(5, 4) 
level = 999
ndx = A==0
A[ndx] = level

答案 1 :(得分:1)

假设找出temp_board 0的位置并不是非常低效,你可以这样做:

# First figure out where the array is zero
zindex = numpy.where(temp_board == 0)
# Make a set of tuples out of it
zindex = set(zip(*zindex))
# Make a set of tuples from indices_to_watch too
indices_to_watch = set([(0,1), (1,2)])
# Find the intersection.  These are the indices that need to be set
indices_to_set = indices_to_watch & zindex
# Set the value
temp_board[zip(*indices_to_set)] = level

如果你不能做到这一点,那么这是一种方式,但我不确定它是否是最Pythonic:

indices_to_watch = [(0,1), (1,2)]

首先,转换为numpy数组:

indices_to_watch = numpy.array(indices_to_watch)

然后,将其设为可索引:

index = zip(*indices_to_watch)

然后,测试条件:

indices_to_set = numpy.where(temp_board[index] == 0)

然后,找出要设置的实际指数:

final_index = zip(*indices_to_watch[indices_to_set])

最后,设置值:

temp_board[final_index] = level

答案 2 :(得分:0)

你应该尝试这些方法:

temp_board[temp_board[field_list] == 0] = level