【问题标题】:convert separate 1D np.arrays into a list of 2D np.arrays将单独的 1D np.arrays 转换为 2D np.arrays 列表
【发布时间】:2015-11-22 21:37:09
【问题描述】:

我正在尝试将三个 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)

【问题讨论】:

    标签: python arrays numpy pandas array-broadcasting


    【解决方案1】:

    首先,您可以通过简单地执行以下操作从 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]])]
    

    【讨论】:

      【解决方案2】:

      这是使用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-1column-3 堆叠在一起,从而为我们提供一个形状为N x 4 的二维NumPy 数组arr2D。接下来,我们将arr2D 重塑为2*N X 2 数组,并沿着np.vsplit 的行进行拆分,从而为我们提供2D 数组的预期列表。

      示例运行 -

      >>> df
         col1  col2  col3
      0     1    10   100
      1     2    20   200
      2     3    30   300
      3     4    40   400
      4     5    50   500
      5     6    60   600
      >>> arr2D = np.column_stack((df['col1'],df['col2'],df['col1'],df['col3']))
      >>> out_list = np.vsplit(arr2D.reshape(-1,2),arr2D.shape[0])
      >>> print out_list
      [array([[  1,  10],
             [  1, 100]]), array([[  2,  20],
             [  2, 200]]), array([[  3,  30],
             [  3, 300]]), array([[  4,  40],
             [  4, 400]]), array([[  5,  50],
             [  5, 500]]), array([[  6,  60],
             [  6, 600]])]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-03
        • 2022-11-03
        • 2019-08-17
        • 1970-01-01
        • 1970-01-01
        • 2019-03-11
        • 1970-01-01
        相关资源
        最近更新 更多