60

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

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

combined_arraywhenA.dtype = stringとで複数の dtype を使用することはできB.dtype = intますか?

4

3 に答える 3

48

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'
于 2012-07-03T11:41:50.307 に答える