如何在numpy或列表列表中填充圆圈

时间:2018-09-04 11:25:33

标签: python 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]

3 个答案:

答案 0 :(得分:1)

您可以尝试在其中一个轴上使用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)

因此,您可以将其用作掩码,以仅处理累加等于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]])

答案 1 :(得分:1)

def fil_list(l):
     begin = l.index(max(l))
     end = l[begin+1:].index(max(l))+begin
     for i in range(begin+1,end+1):
            l[i] = 1
     return l

如果列表中两个都为1,这应该可以工作。但是,这不是找到解决方案的最快方法。

答案 2 :(得分:0)

首先转换字符串的ot列表,然后执行以下命令:

y = [ 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]

yStr = list(map(str,y))
yStr0 = yStr[0]
y0 = list(map(int,yStr0))

y0的结果:

y0 = [0, 0, 0, 1, 1, 1, 1, 1, 0, 0]