目前我有一个代码检查数组中的给定元素是否等于= 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的数组元素并具有具体索引?
或许使用蒙面数组不是要走的路?
答案 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