Подтвердить что ты не робот

Хранить различные типы данных в одном массиве NumPy?

У меня есть два разных массива: один со строками и другой с ints. Я хочу объединить их в один массив, где каждый столбец имеет исходный тип данных. Мое текущее решение для этого (см. Ниже) преобразует весь массив в dtype = string, что кажется очень неэффективным для памяти.

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

Можно ли mutiple dtypes в combined_array, когда A.dtype = string и B.dtype = int?

4b9b3361

Ответ 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'

Ответ 2

Простое решение: преобразуйте ваши данные в объект типа "O"

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

создает массив:

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