J'ai deux tableaux différents, un avec des chaînes et un autre avec des pouces. Je veux les concaténer, dans un tableau où chaque colonne a le type de données d'origine. Ma solution actuelle pour faire cela (voir ci-dessous) convertit le tableau entier en dtype = string, ce qui semble très inefficace en mémoire.
combined_array = np.concatenate((A, B), axis = 1)
Est-il possible de multiplier les dtypes dans combined_array
quand A.dtype = string
et B.dtype = int
?
Une approche pourrait être d'utiliser un tableau d'enregistrement . Les "colonnes" ne seront pas comme les colonnes de tableaux numpy standard, mais pour la plupart des cas d'utilisation, cela suffit:
>>> 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])
Notez que vous pouvez également faire quelque chose de similaire avec un tableau standard en spécifiant le type de données du tableau. Ceci est connu comme un " tableau structuré ":
>>> arr = numpy.array([('a', 0), ('b', 1)],
dtype=([('keys', '|S1'), ('data', 'i8')]))
>>> arr
array([('a', 0), ('b', 1)],
dtype=[('keys', '|S1'), ('data', '<i8')])
La différence est que les tableaux d'enregistrements permettent également d'accéder aux attributs à des champs de données individuels. Les tableaux structurés standard ne le font pas.
>>> 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'
Une solution simple: convertissez vos données en objet de type 'O'
z = np.zeros((2,2), dtype='U2')
o = np.ones((2,1), dtype='O')
np.hstack([o, z])
crée le tableau:
array([[1, '', ''],
[1, '', '']], dtype=object)