#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')])