【问题标题】:windowed selection from a list in python从python中的列表中进行窗口选择
【发布时间】:2019-06-08 21:16:13
【问题描述】:

假设我有一个列表

a=[0,1,2,3,4,5,6,7,8,9]

我使用随机选择一个索引,

i = np.random.choice(np.arange(a.size))

现在,我想选择一个围绕 i 的对称间隔,大小为 2。例如,对于给定的列表,如果选择了索引 i = 5,我会得到类似

print(a[i-2:i+2+1])
>> [3, 4, 5, 6, 7]

这很好用 但是,如果我碰巧靠近终点之一,i = 1。使用我得到的,

print(a[i-2:i+2+1])
>> []

相反,我希望它打印一个不对称的间隔,例如[0, 1, 2, 3]

如果 i = 8

print(a[i-2:i+2+1])
>> [6, 7, 8, 9] 

我也希望如此,所以接近终点似乎并不重要。我最接近解决方案的是(比如 i = 1)

print([a[0:i+3] if a[i-2:i+2+1] == [] else a[i-2:i+2+1] ])
>> [[0, 1, 2, 3]]

但这会返回,[[0,1,2,3]] 而不是 [0,1,2,3]

在 python/numpy 中使用列表推导或其他方法是否有很好的方法来做到这一点?

【问题讨论】:

    标签: python list numpy


    【解决方案1】:

    您只需将较低的索引剪辑为零:

    >>> print(a[max(i-2,0):i+2+1])
    [0, 1, 2, 3]
    

    没有这个,它可能会变成负数。这在切片中具有特殊含义:负索引从列表的 end 开始计数。

    【讨论】:

      【解决方案2】:

      您遇到了 Python 的右端编号。您给了它限制 [-1:3],但 -1 表示右手元素。由于“第一个”元素超过了“最后一个”元素,因此结果切片为 0。在高索引上不会有这个问题,因为那一端没有“环绕”。

      只需使用max 将较低的索引驱动到 0 的轨道。

      print(a[max(i-2, 0)]:i+2+1])
      

      【讨论】:

        【解决方案3】:

        问题是当你退出列表的边界时,它会返回一个空列表。试试:

        a=[0,1,2,3,4,5,6,7,8,9]
        i = 1
        interval=2
        print( a[ max(i-2, 0) : min(i+2+1, len(a)) ] )
        

        我只是在它上面设置了最大/最小界限,所以它不会逃脱它。不是很pythonic,但它是一个快速修复。

        【讨论】:

          猜你喜欢
          • 2018-08-24
          • 2019-09-30
          • 2015-05-25
          • 1970-01-01
          • 2014-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多