2012-11-29 16 views
6

整数からなる最初の列だけを持つsize(N、m)のnumpy配列を作成し、残りはデフォルトでfloatとするだけです。 だから、ゼロに初期化ならば、それは結果でなければなりません:(単純に)整数と浮動混合numpy配列を構築する方法

array([[ 0, 0., 0., 0., 0.], 
     [ 0, 0., 0., 0., 0.], 
     [ 0, 0., 0., 0., 0.], 
     [ 0, 0., 0., 0., 0.], 
     [ 0, 0., 0., 0., 0.]]) 

私が作ったすべての試み、このような構造化された配列を作成しようとしたときに私にいくつかのタプルのサブ要素を返します。

+0

好奇心を持たずに、なぜそれが必要でしょうか? – Rambatino

+0

いくつかの混合データを保存する必要があるとします.1つのフィールドは整数です(離散化された状態)。その他は実数です。 – gluuke

+0

しかし、このデータはどうしていますか? 1 = 1.0の問題はいつですか? – Rambatino

答えて

13

あなたはdtype = objectで配列を使用することができます。算術演算を実行するときに、あなたが右の動作を取得

>>> arr = np.ndarray((10,4),dtype = object) 
>>> arr[:,0] = int(10) 
>>> arr[:,1:] = float(10) 
>>> arr 
array([[10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0]], dtype=object) 

お知らせ。

>>> arr/3 
array([[3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333]], dtype=object) 

それとも、numpy.recarray使用することができます:あなたはすべての値に対して算術演算を実行する必要がある場合は、別々にそれぞれのフィールドで操作を実行する必要があります

>>> import numpy as np 
>>> arr = np.recarray(10,dtype=[('x',int),('y',float,4)]) 
>>> arr[:] = 0 
>>> arr 
rec.array([(0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.])), 
      (0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.])), 
      (0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.])), 
      (0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.])), 
      (0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.]))], 
    dtype=[('x', '<i4'), ('y', '<f8', (4,))]) 
>>> arr['x'] 
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) 
>>> arr['y'] 
array([[ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]]) 

、例えば

>>> arr['x'] += 2 
>>> arr['y'] += 2 
0

すべてのメンバーが同じタイプ

する必要がnumpyのの主な目的は、均質な多次元配列であることを示しnumpyのドキュメント、でこれをお読みください。 要素の表(通常は数値)で、すべて同じ型のもので、正の整数のタプル でインデックスされています。

2

私はあなたが最初の場所でこれをやりたいと思っべきでない理由の多くを考えることができますが、私が判断するために、それはありません、と人々は自分の価値を減少しようとすると、私は嫌いクイックアンドダーティハック。

dtype=objectの論理的根拠です。 Pythonのすべてがオブジェクトなので、配列内の均質性を保ちながら数値型を混在させることができます。私は次のことをお勧めしますが、あなたのニーズに当てはめることができます。

import numpy 

rows = 5 
a = numpy.zeros((rows,5)).astype(object) 
a[:,0] = a[:,0].astype(int) 
print a 

[[0 0.0 0.0 0.0 0.0] 
[0 0.0 0.0 0.0 0.0] 
[0 0.0 0.0 0.0 0.0] 
[0 0.0 0.0 0.0 0.0] 
[0 0.0 0.0 0.0 0.0]] 
関連する問題