1

3 つの 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)
4

2 に答える 2

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]])

次に、この2darrayを3darrayに変換し、リストに変換します

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]])]
于 2015-11-22T13:03:58.387 に答える
1

np.column_stackとを使用した1つのアプローチを次に示しますnp.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_stackしてスタックcolumn-1column-2、次にをスタックcolumn-1して、 shapecolumn-3の 2D NumPy 配列を提供します。次に、配列に再形成し、行に沿って分割して、期待される配列のリストを取得します。arr2DN x 4arr2D2*N X 2np.vsplit2D

サンプルラン -

>>> 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]])]
于 2015-11-22T13:31:47.533 に答える