gpt4 book ai didi

python - 列和行范围内的 Numpy 数组操作

转载 作者:太空宇宙 更新时间:2023-11-04 05:23:00 24 4
gpt4 key购买 nike

我有一个代表灰度图像的 numpy bool 二维数组,它本质上是一个未填充的形状(三角形、正方形、圆形),由 True 代表白色像素,False 对于黑色像素。我想通过将白色像素修改为黑色像素来添加黑色填充。

array([[True, True, True, False, False, False, False, False, True, True, True],
[True, True, True, False, True, True, True, False, True, True, True],
[True, True, True, False, True, True, True, False, True, True, True],
[True, True, True, False, True, True, True, False, True, True, True],
[True, True, True, False, False, False, False, False, True, True, True]])

(此数组中间方格中的 9 个 True 值应变为 False。)

是否有一个 numpy slice 方法可以使这变得简单/快速?我可以随时修改所有 True 的东西,只要有一个 False 后跟一个 True 直到下一个 False >?

最佳答案

这是一个易于实现并且应该相当快地执行的想法。

我将使用 0 和 1,这样看起来更清楚一些。

这是起始数组:

>>> a
array([[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1],
[1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1],
[1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1],
[1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1],
[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1]])

使用 np.logical_and.accumulate 从左到右累加,从左到右翻转,再次执行相同操作,向后翻转,然后将两个数组“或”在一起:

>>> andacc = np.logical_and.accumulate
>>> (andacc(a, axis=1) | andacc(a[:, ::-1], axis=1)[:, ::-1]).astype(int)
array([[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1],
[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1],
[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1],
[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1],
[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1]])

(省略 .astype(int) 以保留 bool 数组而不是 0 和 1。)

这是一个三角形:

>>> b
array([[1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1],
[1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1],
[1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1],
[0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0]])

>>> (andacc(b, axis=1) | andacc(b[:, ::-1], axis=1)[:, ::-1]).astype(int)
array([[1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

关于python - 列和行范围内的 Numpy 数组操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39732957/

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