作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前,我有一个代码检查数组中的给定元素是否等于= 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_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
关于python - Numpy 掩码数组修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2306280/
我是一名优秀的程序员,十分优秀!