首页 > 解决方案 > 如何在 numpy 或列表列表中填充圆圈

问题描述

我有以下数组:

 0 0 0 1 1 1 1 1 0 0
 0 0 1 0 0 0 0 0 1 0
 0 1 0 0 0 0 0 0 0 1
 1 0 0 0 0 0 0 0 0 0
 1 0 0 0 0 0 0 0 0 0
 1 0 0 0 0 0 0 0 0 0
 1 0 0 0 0 0 0 0 0 0
 1 0 0 0 0 0 0 0 0 0
 0 1 0 0 0 0 0 0 0 1
 0 0 1 0 0 0 0 0 1 0

如何用一个填充圆圈内的空间?

目前数据结构是一个 10x10 的 numpy 数组,但是我可以将数据保存为 10 个列表。

例如列表 2 将是:

 list_2 = [0 0 1 0 0 0 0 0 1 0]

然后,一旦应用该功能,将变为:

 list_2 = [0, 0, 1, 1, 1, 1, 1, 1, 1, 0]

标签: pythonnumpy

解决方案


您可以尝试使用np.cumsum其中一个轴(即01作为参数):

crcl[crcl.cumsum(0)==1] = 1

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

分步说明:

这是您开始使用的 numpy 数组:

crcl
array([[0, 0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 0, 0, 0, 0, 0, 1, 0],
       [0, 1, 0, 0, 0, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 1, 0, 0, 0, 0, 0, 0, 0, 1],
       [0, 0, 1, 0, 0, 0, 0, 0, 1, 0]])

累积和将内部空间与外部空间分开,因为它仅在边界处发生变化:

crcl.cumsum(0)
array([[0, 0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 0],
       [0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [2, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [3, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [4, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [5, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [5, 2, 1, 1, 1, 1, 1, 1, 1, 2],
       [5, 2, 2, 1, 1, 1, 1, 1, 2, 2]], dtype=int32)

因此,您将其用作掩码来仅处理 cumsum 等于 的那些索引1

mask = crcl.cumsum(0)==1

并将 l 本身在这些位置的值设置为1

crcl[mask] = 1

crcl
array([[0, 0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 0],
       [0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 0]])

推荐阅读