将单独的1D np.arrays转换为2D np.arrays列表

时间:2015-11-22 12:30:03

标签: python arrays numpy pandas numpy-broadcasting

我试图将三个1D数组转换为2D数组列表。我通过创建一个空的ndarray并逐行填充它来设法做到这一点。有人能给我一个更优雅的方法吗?

import numpy as np
import pandas as pd
one=np.arange(1,4,1)
two=np.arange(10,40,10)
three=np.arange(100,400,100)
df=pd.DataFrame({'col1':one,'col2':two,'col3':three})

desired_output=[np.array([[1.,10.],[1.,100.]]),np.array([[2.,20.],[2.,200.]]),np.array([[3.,30.],[3.,300.]])]

当前,不优雅的方法有效:

output=[]
for i in range(len(df)):
    temp=np.zeros(shape=(2,2))
    temp[0][0]=df.iloc[i,0]
    temp[0][1]=df.iloc[i,1]
    temp[1][0]=df.iloc[i,0]
    temp[1][1]=df.iloc[i,2]
    output.append(temp)

2 个答案:

答案 0 :(得分:2)

首先,您只需执行以下操作即可从df值获取数组

In [61]:
arr = df.values
arr
Out[61]:
array([[  1,  10, 100],
       [  2,  20, 200],
       [  3,  30, 300]])

然后再次添加数组中的第一列

In [73]:
arr_mod = np.hstack((arr , arr[: , 0][:, np.newaxis]))
arr_mod
Out[73]:
array([[  1,  10, 100,   1],
       [  2,  20, 200,   2],
       [  3,  30, 300,   3]])

将您刚刚添加的列与数组中的最后一列交换

In [74]:
arr_mod[: , [2 , 3]] = arr_mod [:  , [3 , 2]]
arr_mod
Out[74]:
array([[  1,  10,   1, 100],
       [  2,  20,   2, 200],
       [  3,  30,   3, 300]])

然后将此2d array转换为3d array并将其转换为列表

In [78]:
list(arr_mod.reshape( -1, 2 , 2))
Out[78]:
[array([[  1,  10],
        [  1, 100]]), array([[  2,  20],
        [  2, 200]]), array([[  3,  30],
        [  3, 300]])]

答案 1 :(得分:1)

以下是使用np.column_stacknp.vsplit -

的一种方法
arr2D = np.column_stack((df['col1'],df['col2'],df['col1'],df['col3']))
out_list = np.vsplit(arr2D.reshape(-1,2),arr2D.shape[0])

基本上,我们使用np.column_stackcolumn-1column-2进行堆叠,然后使用column-1再次column-3来为我们提供2D NumPy数组{{1}形状arr2D。接下来,我们将N x 4重新整形为arr2D数组,并使用2*N X 2沿着行分割,以便为我们提供np.vsplit数组的预期列表。

示例运行 -

2D