【问题标题】:Array into multiple arrays数组成多个数组
【发布时间】:2018-04-16 17:41:04
【问题描述】:

(Python) 我有以下数组

x=[1,2,3,4,5,6]

我想要这个

x=[[1,2],[2,3],[3,4],[4,5],[5,6]]

我用过这个功能

def split(arr, size):
 arrs = []
 while len(arr) > size:
     pice = arr[:size]
     arrs.append(pice)
     arr   = arr[size:]
 arrs.append(arr)
 return arrs

但它只会生成这个

x=[[1,2],[3,4],[5,6]]

【问题讨论】:

  • 如果要寻找性能,请使用 NumPy strides 或 broadcasting - stackoverflow.com/questions/40084931/…
  • 你有一个简单的错误。将arr = arr[size:] 更改为arr = arr[1:]
  • 你说x是一个数组,但是显示一个列表。该代码还生成列表。这是列表问题还是 numpy 数组问题?我很想编辑标签,删除 'arrays'、'numpy' 和 'split'
  • @JeffLearman 我很确定它不应该是 size-1 尽管我同意 OP 没有指定。 arr = arr[1:] 为所有大小值返回类似类型的输出(即,相同长度的列表,值连续)。
  • @pault:也许你是对的:这取决于size 的意思。 size-1 在 size 为 2 时有效,并且在 size 为 >2 时执行一些可能有意义的事情

标签: python arrays numpy split repeat


【解决方案1】:

我想您想开发自己的代码,而不是使用库或内置函数。

你的代码没问题。

只有一个简单的错误:在arr = arr[size:]这一行中将切片索引从size更改为1,其中1表示size - (size-1)

def split(arr, size):
    arrs = []
    while len(arr) > size:
        pice = arr[:size]
        arrs.append(pice)
        arr  = arr[1:]
    arrs.append(arr)
    return arrs

输出:

[[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]

它也适用于其他尺寸:

print split(x, 3)
print split(x, 4)

[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]
[[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]

【讨论】:

  • 这不适用于split(x, 3) 等。它碰巧适用于这种特定情况,但它是错误的。
  • 您可以通过注意 size-(size-1) = 1 来简化
  • 不,我的意思是正确的做法是不要在切片中使用size。代码应为arr = arr[1:]。您希望每次将列表滑动 1。它独立于size
  • @pault:真的吗? size 的语义是什么?作者没说。
  • @JeffLearman 此交流发生在您发布正确指出 OP 未指定的评论之前。我坚持我对问题的解释,尽管我承认你的观点是正确的。
【解决方案2】:

用索引循环你的数组,然后将[index : index+size] 作为新数组的一个元素。

代码如下:

x=[1,2,3,4,5,6]
size = 2
print([x[index:index+size] for index in range(0, len(x)-size+1)])
size = 4
print([x[index:index+size] for index in range(0, len(x)-size+1)])

输出:

[[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]
[[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]
[Finished in 0.189s]

或者使用 size>1 的 zip()。

x=[1,2,3,4,5,6]
size = 2
print( [item for item in zip( *[x[index:len(x)+index-1] for index in range(0, size)])])
size = 4
print( [item for item in zip( *[x[index:len(x)+index-1] for index in range(0, size)])])

输出:

[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
[(1, 2, 3, 4), (2, 3, 4, 5), (3, 4, 5, 6)]
[Finished in 0.284s]

【讨论】:

    【解决方案3】:

    您可以使用more_itertools 模块中的windowed() 函数。

    from more_itertools import windowed
    x = list(windowed(x, 2))
    

    您可以使用pip 安装它

    pip install more-itertools
    

    【讨论】:

      【解决方案4】:

      试试这个:

      def split(arr, size):
          return [x[i:i+size] for i in range(0,len(x)-size+1)]
      

      【讨论】:

      • 这可能是正确的,具体取决于 OP 未指定的 size 的含义。但它非常 Pythonic,并显示了列表推导的使用。如果size 有其他含义,它是可以修复的。
      【解决方案5】:
      a = [1,2,3,4,5]
      
      answer = list(map(list, zip(a, a[1:])))
      
      print(answer)
      

      【讨论】:

      • 我不希望它是一个元组,而是一个数组中的数组
      • @BeatrizOrozco:这会在列表中生成列表,您的示例将其显示为预期输出。元组将使用括号打印,而不是方括号。需要为size 修改它而不是2。
      • 我修好了,谢谢
      【解决方案6】:

      在使用 NumPy 时,您可以使用精美的索引。这将需要将 x 转换为 numpy 数组。您还需要在下面创建一个标记为ind 的事件数组

      x=[1,2,3,4,5,6]
      x = np.array(x)
      
      ind = np.arange(len(x)-1)[:,None] + np.arange(2)
      
      x[ind]
      
      array([[1, 2],
             [2, 3],
             [3, 4],
             [4, 5],
             [5, 6]])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多