web-dev-qa-db-fra.com

Stocker différents types de données dans un tableau NumPy?

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?

41
veor

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'
35
senderle

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)
4
astroMonkey