web-dev-qa-db-ja.com

1つのNumPy配列に異なるデータ型を保存しますか?

2つの異なる配列があります。1つは文字列で、もう1つはintです。それらを連結して、各列が元のデータ型を持つ1つの配列にします。これを行うための私の現在のソリューション(下記参照)は、配列全体をdtype = stringに変換しますが、これは非常にメモリ効率が悪いようです。

combined_array = np.concatenate((A, B), axis = 1)

combined_arrayおよびA.dtype = stringのときにB.dtype = intのdtypeを複数にすることは可能ですか?

41
veor

1つのアプローチは、 レコード配列 を使用することです。 「列」は標準のnumpy配列の列とは異なりますが、ほとんどのユースケースではこれで十分です。

>>> a = numpy.array(['a', 'b', 'c', 'd', 'e'])
>>> b = numpy.arange(5)
>>> records = numpy.rec.fromarrays((a, b), names=('keys', 'data'))
>>> records
rec.array([('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4)], 
      dtype=[('keys', '|S1'), ('data', '<i8')])
>>> records['keys']
rec.array(['a', 'b', 'c', 'd', 'e'], 
      dtype='|S1')
>>> records['data']
array([0, 1, 2, 3, 4])

配列のデータ型を指定することにより、標準配列でも同様のことができることに注意してください。これは「 構造化配列 」として知られています。

>>> arr = numpy.array([('a', 0), ('b', 1)], 
                      dtype=([('keys', '|S1'), ('data', 'i8')]))
>>> arr
array([('a', 0), ('b', 1)], 
      dtype=[('keys', '|S1'), ('data', '<i8')])

違いは、レコード配列では個々のデータフィールドへの属性アクセスも許可されることです。標準の構造化配列にはありません。

>>> records.keys
chararray(['a', 'b', 'c', 'd', 'e'], 
      dtype='|S1')
>>> arr.keys
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'numpy.ndarray' object has no attribute 'keys'
35
senderle

簡単な解決策:データをオブジェクト「O」タイプに変換する

z = np.zeros((2,2), dtype='U2')
o = np.ones((2,1), dtype='O')
np.hstack([o, z])

配列を作成します:

array([[1, '', ''],
       [1, '', '']], dtype=object)
4
astroMonkey