2016-08-12 34 views
1

私はいくつかの配列を持っていますが、それらのうちのいくつかは浮動小数点数を持ち、その他は文字列を持ち、すべての配列は同じ長さです。これらの配列でnumpy.column_stackを使用しようとすると、この関数は文字列に浮動小数点数を変換します。例:数値と文字列の配列を持つnumpy.column_stack

a = np.array([3.4,3.4,6.4]) 
b = np.array(['holi','xlo','xlo']) 

B = np.column_stack((a,b)) 

print B 
>>> [['3.4' 'holi'] 
    ['3.4' 'xlo'] 
    ['3.4' 'xlo'] 

type(B[0,0]) 
>>> numpy.string 

なぜですか?それを避けることは可能ですか? ありがとうございました。

答えて

3

このような混合型データを格納するには、Object dtype配列として格納するか、structured arraysを使用する必要があります。 Object dtype配列を使用すると、入力配列のいずれかをObject dtypeの先頭に変換し、それを積み重ねる残りの配列の横に積み重ねることができます。残りの配列は自動的にObject dtypeに変換され、その型の積み重ねられた配列が与えられます。

In [88]: a 
Out[88]: array([ 3.4, 3.4, 6.4]) 

In [89]: b 
Out[89]: 
array(['holi', 'xlo', 'xlo'], 
     dtype='|S4') 

In [90]: out = np.column_stack((a.astype(np.object),b)) 

In [91]: out 
Out[91]: 
array([[3.4, 'holi'], 
     [3.4, 'xlo'], 
     [6.4, 'xlo']], dtype=object) 

In [92]: out[:,0].astype(float) 
Out[92]: array([ 3.4, 3.4, 6.4]) 

In [93]: out[:,1].astype(str) 
Out[93]: 
array(['holi', 'xlo', 'xlo'], 
     dtype='|S4') 
+0

すばやく応答していただきありがとうございます。 –

2

を最も簡単な構造化された配列のアプローチはrec.fromarraysである - したがって、我々は、積み重ねられた配列を作成し、バック個々のアレイを取得する方法を示すためにSO-

np.column_stack((a.astype(np.object),b)) 

のサンプル実行のような実装を持っているでしょう関数:

In [1411]: a=np.array([3.4,3.4,6.4]); b=np.array(['holi','xlo','xlo']) 
In [1412]: B = np.rec.fromarrays([a,b],names=['a','b']) 
In [1413]: B 
Out[1413]: 
rec.array([(3.4, 'holi'), (3.4, 'xlo'), (6.4, 'xlo')], 
      dtype=[('a', '<f8'), ('b', '<U4')]) 
In [1414]: B['a'] 
Out[1414]: array([ 3.4, 3.4, 6.4]) 
In [1415]: B['b'] 
Out[1415]: 
array(['holi', 'xlo', 'xlo'], 
     dtype='<U4') 

その他のパラメータについては、ドキュメントを確認してください。しかし、基本的に正しいコンパウンドdtypeの空の配列を作成し、配列をそれぞれのフィールドにコピーします。

関連する問題