【发布时间】:2019-03-29 15:06:36
【问题描述】:
如何以有效的方式访问和修改 2D numpy 数组的周围 8 个单元?
我有一个像这样的二维 numpy 数组:
arr = np.random.rand(720, 1440)
对于每个网格单元,我想减少 10% 的中心单元,周围的 8 个单元(角单元减少),但前提是周围的单元值超过 0.25。我怀疑这样做的唯一方法是使用 for 循环,但想看看是否有更好/更快的解决方案。
-- 编辑:基于循环的求解:
arr = np.random.rand(720, 1440)
for (x, y), value in np.ndenumerate(arr):
# Find 10% of current cell
reduce_by = value * 0.1
# Reduce the nearby 8 cells by 'reduce_by' but only if the cell value exceeds 0.25
# [0] [1] [2]
# [3] [*] [5]
# [6] [7] [8]
# * refers to current cell
# cell [0]
arr[x-1][y+1] = arr[x-1][y+1] * reduce_by if arr[x-1][y+1] > 0.25 else arr[x-1][y+1]
# cell [1]
arr[x][y+1] = arr[x][y+1] * reduce_by if arr[x][y+1] > 0.25 else arr[x][y+1]
# cell [2]
arr[x+1][y+1] = arr[x+1][y+1] * reduce_by if arr[x+1][y+1] > 0.25 else arr[x+1][y+1]
# cell [3]
arr[x-1][y] = arr[x-1][y] * reduce_by if arr[x-1][y] > 0.25 else arr[x-1][y]
# cell [4] or current cell
# do nothing
# cell [5]
arr[x+1][y] = arr[x+1][y] * reduce_by if arr[x+1][y] > 0.25 else arr[x+1][y]
# cell [6]
arr[x-1][y-1] = arr[x-1][y-1] * reduce_by if arr[x-1][y-1] > 0.25 else arr[x-1][y-1]
# cell [7]
arr[x][y-1] = arr[x][y-1] * reduce_by if arr[x][y-1] > 0.25 else arr[x][y-1]
# cell [8]
arr[x+1][y-1] = arr[x+1][y-1] * reduce_by if arr[x+1][y-1] > 0.25 else arr[x+1][y-1]
【问题讨论】:
-
添加一个有效的循环解决方案?
-
结果很大程度上取决于遍历顺序,但是呃。我可以建议的唯一改进是使用 numpy 的意见
a=arr[x-1:x+1, y-1:y+1]; a-=value; a[1,1]+=value; a=np.clip(a, 0.25)你明白了。 -
@WalterTross,如果边界单元格保持不变,我会没事的。
-
明确一点:正如所写,当您引用它们时,值已经减少了。也就是说,
a[0, 0]可能是 0.4,但在循环到达a[1, 0]时会减少到 0.2,因此初始值不会影响a[1,0]。这是故意的吗? -
我感觉这只能迭代完成,因为一步会影响下一步