【问题标题】:how to merge several arrays stored in list如何合并存储在列表中的几个数组
【发布时间】:2020-11-02 11:13:20
【问题描述】:

我想连接几个存储在列表中的数组。数组的长度不同。我已经阅读了this solution,但不幸的是我无法解决我的问题。这是简化的输入数据:

arr_all= [array([[1 ,2 , 10],
                 [5, 8, 3]]),
          array([[1, 0, 5]]),
          array([[0, 1, 8]]),
          array([[9, 13, 0]]),
          array([[2, 10, 2],
                 [1.1, 3, 3]]),
          array([[25, 0, 0]])]
n_data_sets=2
n_repetition=3

现在,我想合并(连接)第一个数组 arr_all (arr_all[0]) 和第四个数组 (arr_all[3]),第二个数组 (arr_all[1]) 和第五个数组 (arr_all[4])第三个(arr_all[2])和最后一个(arr_all[5])。事实上,这里我有两个数据集(n_data_sets=2),它们重复了三次(n_repetition=3)。实际上,我有几个重复数十次的数据集。我想将每个数据集放在我列表的单个数组中。我可以说输入是根据重复排序的,但我想根据每次重复的数据集进行排序。我的预期结果是:

arr_all= [array([[1, 2 , 10],
                 [5, 8, 3],
                 [9, 13, 0]]),
          array([[1, 0, 5],
                 [2, 10, 2],
                 [1.1, 3, 3]]),
          array([[0, 1, 8],
                 [25, 0, 0]])]

我的输入数据是一个包含六个数组的列表(n_repetitionn_data_sets),但我的结果包含 n_repetition 数组。 提前感谢任何反馈。

【问题讨论】:

  • 在内部循环中使用双 for 循环和 range(i,len(arr_all),n_repetition),如果您使用元素 [i] 开始串联,则使用 range(i+n_repetition,len(arr_all),n_repetition)
  • 亲爱的@rioV8。感谢您的反馈。你能再解释一下吗?如何使用双循环?非常感谢您的宝贵时间。

标签: python arrays list numpy


【解决方案1】:

为了进一步回应 Alexander 的回应,我想出了以下办法:

import numpy as np

arr_all = [np.array([[1, 2, 10], [5, 8, 3]]),
           np.array([[1, 0, 5]]),
           np.array([[0, 1, 8]]),
           np.array([[9, 13, 0]]),
           np.array([[2, 10, 2], [1.1, 3, 3]]),
           np.array([[25, 0, 0]])]
n_data_sets = 2
n_repetition = 3

new_array = []
for i in range(n_repetition):
    dataset = arr_all[i]
    for j in range(n_data_sets-1):
        dataset = np.concatenate([dataset, arr_all[i+(n_repetition*(j+1))]])
    new_array.append(dataset)

print(new_array)

我还找到了一种更简洁的方法,但在时间方面可能更糟:

import numpy as np

arr_all = [np.array([[1, 2, 10], [5, 8, 3]]),
           np.array([[1, 0, 5]]),
           np.array([[0, 1, 8]]),
           np.array([[9, 13, 0]]),
           np.array([[2, 10, 2], [1.1, 3, 3]]),
           np.array([[25, 0, 0]])]
n_data_sets = 2
n_repetition = 3

reshaped = np.reshape(arr_all, (n_repetition, n_data_sets), order='F')

new = []

for arr in reshaped:
    new.append(np.concatenate(arr))

print(new)

【讨论】:

  • 亲爱的@Jonathan,这正是我所需要的。我很感激。感谢您的宝贵时间。
【解决方案2】:

两个总是将前半部分与后半部分合并(如果这是你的意图),你可以做这样的事情(如果你有偶数数量的数组,这将起作用。

import numpy as np

arr_all= [np.array([[1 ,2 , 10],
                 [5, 8, 3]]),
          np.array([[1, 0, 5]]),
          np.array([[0, 1, 8]]),
          np.array([[9, 13, 0]]),
          np.array([[2, 10, 2],
                 [1.1, 3, 3]]),
          np.array([[25, 0, 0]])]
          
half = int(len(arr_all)/2)

new = []
for i in range(half):
    new.append(np.concatenate((arr_all[i],arr_all[i+half]), axis=0))

print(new)

【讨论】:

  • 亲爱的@Alexander Riedel。感谢您的解决方案。关键是很多时候它不可能是一半。在我的简化中是一半,但如果我对三个数据集重复三次,那么我的输入将有 9 个数组,但我想要三个。
猜你喜欢
  • 2018-03-18
  • 2016-07-07
  • 2021-09-05
  • 2012-12-19
  • 2013-11-16
  • 2016-08-06
  • 2023-01-21
  • 1970-01-01
  • 2010-09-22
相关资源
最近更新 更多