8

最初の列だけが整数で構成され、残りはデフォルトでfloatであるsize(N、m)の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.]])

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

4

3 に答える 3

18

配列を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
于 2012-11-29T16:57:45.413 に答える
3

そもそもこれをやりたくない理由はたくさん考えられますが、それを判断するのは私ではありません。また、人々が私の手っ取り早いハックの価値を貶めようとするのは嫌いです。

根拠は、使用すること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]]
于 2012-11-29T17:13:52.330 に答える
1

すべてのメンバーが同じタイプでなければならないことを示すnumpyドキュメントでこれを読んでください

NumPy の主な目的は同種多次元配列です。これは要素 (通常は数値) のテーブルであり、正の整数のタプルによってインデックス付けされた、すべて同じ型です。

于 2012-11-29T16:52:32.933 に答える