2つの異なる配列があります。1つは文字列で、もう1つはintです。それらを連結して、各列が元のデータ型を持つ1つの配列にします。これを行うための私の現在のソリューション(下記参照)は、配列全体をdtype = stringに変換しますが、これは非常にメモリ効率が悪いようです。
combined_array = np.concatenate((A, B), axis = 1)
combined_array
およびA.dtype = string
のときにB.dtype = int
のdtypeを複数にすることは可能ですか?
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'
簡単な解決策:データをオブジェクト「O」タイプに変換する
z = np.zeros((2,2), dtype='U2')
o = np.ones((2,1), dtype='O')
np.hstack([o, z])
配列を作成します:
array([[1, '', ''],
[1, '', '']], dtype=object)