добавление numpy, ошибка типа: недопустимое повышение типа

#python #numpy #multidimensional-array #numpy-ndarray

#python #numpy #многомерный массив #numpy-ndarray

Вопрос:

Я хочу создать numpy ndarray со смешанными типами данных. Но у меня возникла проблема с добавлением к нему другой строки. Моя цель — инициализировать k и продолжать добавлять к нему строки в будущем.

 import numpy as np

k = np.ndarray((0,3), dtype=[('name', str), ('age', int), ('height', float)])
print(f'k datatype: {k.dtype}')
# k datatype: [('name', '<U'), ('age', '<i4'), ('height', '<f8')]
np.append(k, ['matt', 40, 180.5])
# TypeError: invalid type promotion
  

Если я не укажу dypte при создании k, ошибки не будет, но все столбцы в ndarray имеют один и тот же тип данных (строка).

Любая помощь приветствуется. Спасибо

Комментарии:

1. dtype должен совпадать.

2. но они это делают, не так ли? ‘matt’ — это строка, 40 — это it, а 180.5 — значение с плавающей точкой.

3. Нет. np.append преобразует список в массив перед передачей его в concatenate. Look at np.array([‘matt’, 40, 180.5])`. Его dtype не соответствует. С помощью составного dtype вы должны указать dtype.

4. Тот факт, что вы начинаете с массива (0,3), предполагает, что вы намерены делать это append неоднократно. Не делайте этого. Соберите значения в список и создайте массив один раз. И убедитесь, что это список кортежей. Потренируйтесь использовать этот dtype для создания массива без итерации.

Ответ №1:

В вашем коде есть две ошибки. Во-первых, вы должны указать object dtype для полей, которые вы намереваетесь сделать строками переменной длины.

Второе — это то, что numpy по-разному обрабатывает lists и tuples в соответствии с их концептуальным происхождением. Перед добавлением необходимо преобразовать объект, который вы хотите добавить, в эквивалент структуры.

Это сработает:

 import numpy as np

k = np.ndarray((0,3), dtype=[('name', object), ('age', int), ('height', float)])
np.append(k, np.array(('matt', 40, 180.5), dtype=k.dtype))
  

Вывод:

 array([('matt', 40, 180.5)],
      dtype=[('name', 'O'), ('age', '<i4'), ('height', '<f8')])