gpt4 book ai didi

python - Numpy 掩码数组修改

转载 作者:行者123 更新时间:2023-12-01 06:17:44 24 4
gpt4 key购买 nike

目前,我有一个代码检查数组中的给定元素是否等于= 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 并具有具体索引的数组元素?

或者也许使用屏蔽数组不是正确的方法?

最佳答案

假设找出 temp_board0 的位置并不是非常低效,你可以像这样做你想做的事:

# 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

关于python - Numpy 掩码数组修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2306280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com