2016-11-17 81 views
0

我有一個導出的熊貓數據框,現在是一個numpy.array對象。numpy數組到ndarray

subset = array[:4,:] 
array([[ 2.  , 12.  , 33.33333333, 2.  , 
     33.33333333, 12.  ], 
     [ 2.  , 2.  , 33.33333333, 2.  , 
     33.33333333, 2.  ], 
     [ 2.8  , 8.  , 45.83333333, 2.75  , 
     46.66666667, 13.  ], 
     [ 3.11320755, 75.  , 56.  , 3.24  , 
     52.83018868, 33.  ]]) 
print subset.dtype 
dtype('float64') 

我是列值轉換爲特定類型,並設置列名以及,這意味着我需要將其轉換爲ndarray。

這裏是我的dtypes:

[('PERCENT_A_NEW', '<f8'), ('JoinField', '<i4'), ('NULL_COUNT_B', '<f8'), 
('PERCENT_COMP_B', '<f8'), ('RANKING_A', '<f8'), ('RANKING_B', '<f8'), 
('NULL_COUNT_B', '<f8')] 

當我去到數組轉換,我得到:

ValueError: new type not compatible with array. 

你怎麼投的每一列在某一特定值,所以我可以在陣列轉換到ndarray?

謝謝

+0

你應該用正確的D型像'np.int16','np.float32','NP。 float64' .... – Chr

+2

你可以在熊貓身上使用['.astype'](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.astype.html)方法。爲什麼不必要地轉換爲數組? – Kartik

+0

@Kartik我正在使用的程序使用numpy數組。 –

回答

2

您已有ndarray。你正在尋找的是一個結構化數組,一個是這個複合dtype。首先看看pandas是否可以爲你做。如果失敗了,我們可能可以通過tolist和列表理解來做些事情。

In [84]: dt=[('PERCENT_A_NEW', '<f8'), ('JoinField', '<i4'), ('NULL_COUNT_B', '< 
    ...: f8'), 
    ...: ('PERCENT_COMP_B', '<f8'), ('RANKING_A', '<f8'), ('RANKING_B', '<f8'), 
    ...: ('NULL_COUNT_B', '<f8')] 
In [85]: subset=np.array([[ 2.  , 12.  , 33.33333333, 2.  
    ...: , 
    ...:   33.33333333, 12.  ], 
    ...:  [ 2.  , 2.  , 33.33333333, 2.  , 
    ...:   33.33333333, 2.  ], 
    ...:  [ 2.8  , 8.  , 45.83333333, 2.75  , 
    ...:   46.66666667, 13.  ], 
    ...:  [ 3.11320755, 75.  , 56.  , 3.24  , 
    ...:   52.83018868, 33.  ]]) 
In [86]: subset 
Out[86]: 
array([[ 2.  , 12.  , 33.33333333, 2.  , 
     33.33333333, 12.  ], 
     [ 2.  , 2.  , 33.33333333, 2.  , 
     33.33333333, 2.  ], 
     [ 2.8  , 8.  , 45.83333333, 2.75  , 
     46.66666667, 13.  ], 
     [ 3.11320755, 75.  , 56.  , 3.24  , 
     52.83018868, 33.  ]]) 

現在用dt製作一個數組。輸入一個結構數組必須是一個元組列表 - 所以我使用tolist和列表理解

In [87]: np.array([tuple(row) for row in subset.tolist()],dtype=dt) 
.... 
ValueError: field 'NULL_COUNT_B' occurs more than once 
In [88]: subset.shape 
Out[88]: (4, 6) 
In [89]: dt 
Out[89]: 
[('PERCENT_A_NEW', '<f8'), 
('JoinField', '<i4'), 
('NULL_COUNT_B', '<f8'), 
('PERCENT_COMP_B', '<f8'), 
('RANKING_A', '<f8'), 
('RANKING_B', '<f8'), 
('NULL_COUNT_B', '<f8')] 
In [90]: dt=[('PERCENT_A_NEW', '<f8'), ('JoinField', '<i4'), ('NULL_COUNT_B', '< 
    ...: f8'), 
    ...: ('PERCENT_COMP_B', '<f8'), ('RANKING_A', '<f8'), ('RANKING_B', '<f8')] 
In [91]: np.array([tuple(row) for row in subset.tolist()],dtype=dt) 
Out[91]: 
array([(2.0, 12, 33.33333333, 2.0, 33.33333333, 12.0), 
     (2.0, 2, 33.33333333, 2.0, 33.33333333, 2.0), 
     (2.8, 8, 45.83333333, 2.75, 46.66666667, 13.0), 
     (3.11320755, 75, 56.0, 3.24, 52.83018868, 33.0)], 
     dtype=[('PERCENT_A_NEW', '<f8'), ('JoinField', '<i4'), ('NULL_COUNT_B', '<f8'), ('PERCENT_COMP_B', '<f8'), ('RANKING_A', '<f8'), ('RANKING_B', '<f8')])