【问题标题】:Looping through 2 numpy arrays and concatenating them循环遍历 2 个 numpy 数组并将它们连接起来
【发布时间】:2018-08-28 16:59:43
【问题描述】:

我有两个 numpy 数组

data_0.shape = (500, 52) 和

data_3.shape = (480, 52)

我正在尝试通过以特殊方式连接上述两个数组来创建一个新数组。到目前为止,我一直像这样手动执行此操作。

data_train = np.concatenate((data_0[:50],data_3[:50],data_0[50:100],data_3[50:100],data_0[100:150],data_3[100:150],
                        data_0[150:200],data_3[150:200],data_0[200:250],data_3[200:250],data_0[250:300],data_3[250:300],
                        data_0[300:350],data_3[300:350],data_0[350:400],data_3[350:400],data_0[400:450],data_3[400:450],
                        data_0[450:],data_3[450:]))

如你所见,我基本上是从 data_0 和 data_3 中各取 50 个值,并将它们连接在一起得到新的数组 data_train,其形状如下。

data_train.shape = (980, 52)

此过程非常耗时,我正在尝试自动执行此任务。这就是我的代码的样子,但我对如何同时循环遍历这两个数组以及如何通过交替从两个数组中获取 50 个值来连接它们感到困惑?

j = 0
k = 10
data_train = []

   data_train.append(np.concatenate((data_0[j:k],data_3[j:k])))
   j = j+10
   k = k+10
   data_train = np.array(data_train)

我应该如何在这里启动 for 循环?

【问题讨论】:

    标签: python arrays numpy for-loop


    【解决方案1】:

    由于np.concatenate 接受任何序列,我们可以传递一个列表理解:

    np.concatenate([arr[i:i+50] for i in range(0, 500, 50) for arr in (data_0, data_3)])
    

    在英语中,这表示对于起始索引i,它从0,以50 为步长,到500(不包括它因此以450 结尾)和一个数组from:data_0,data_3,从这个起始索引到那个索引+50的切片。

    它会产生以下结果:

    data_0[0:50]
    data_3[0:50]
    data_0[50:100]
    data_3[50:100]
    ...
    data_0[450:500]
    data_3[450:500]
    

    这是我们想要的。

    【讨论】:

    • 非常感谢,非常感谢
    【解决方案2】:

    内部列表可以由列表推导式生成

    collection = sum([data0[50*i: 50*(i+1)], data3[50*i: 50*(i+1)]] for i in range(int(len(train_data)//50)), start=[]]
    

    这会创建成对的[data0, data3] 切片,并使用sum 函数列出它们(在这种情况下,它将列表连接成一个更大的列表)

    【讨论】:

    • 非常感谢,非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多