Эффективное приведение списка Python к массиву Numpy с пользовательским типом данныхPython

Программы на Python
Ответить
Anonymous
 Эффективное приведение списка Python к массиву Numpy с пользовательским типом данных

Сообщение Anonymous »

Я использую Python для создания механизма рендеринга OpenGL и использую массивы numpy с пользовательским типом данных для хранения данных вершин.

Код: Выделить всё

import numpy as np

data_type_vertex = np.dtype({
"names": ["x", "y", "z" , "color"],
"formats": [np.float32, np.float32, np.float32, np.uint32],
"offsets": [0, 4, 8, 12],
"itemsize": 16
})
При загрузке данных вершин из файла .obj полезно временно сохранить данные вершин в обычном списке Python перед преобразованием этих данных в массив Numpy с моим пользовательским типом данных. Однако простая попытка преобразовать список в массив Python дает неожиданные результаты.

Код: Выделить всё

vertex_list = [
[1.1, 2.2, 3.3, 5],
[4.4, 5.5, 6.6, 7]
]

print(np.array(vertex_list, dtype=data_type_vertex))

# Result
# [[(1.1, 1.1, 1.1, 1) (2.2, 2.2, 2.2, 2) (3.3, 3.3, 3.3, 3)
#   (5. , 5. , 5. , 5)]
# [(4.4, 4.4, 4.4, 4) (5.5, 5.5, 5.5, 5) (6.6, 6.6, 6.6, 6)
#  (7. , 7. , 7. , 7)]]
Как видно, каждый элемент списка преобразуется в полный экземпляр пользовательского типа данных путем сопоставления элемента со всеми полями вместо предполагаемого преобразования подсписков в экземпляры настраиваемых типов данных. Эту проблему можно решить, инициализируя массив заполнителей и итеративно преобразуя все элементы списка.

Код: Выделить всё

vertex_array = np.zeros(len(vertex_list), dtype=data_type_vertex)
for i, v in enumerate(vertex_list):
vertex_array[i] = (v[0], v[1], v[2], v[3])

print(vertex_array)

# Result
# [(1.1, 2.2, 3.3, 5) (4.4, 5.5, 6.6, 7)]
Хотя это работает, это выглядит несколько неуклюже и может потребовать большого количества жестко закодированных функций преобразования, если вводится несколько пользовательских типов данных.
Есть ли лучший способ добиться того же результата?>

Подробнее здесь: https://stackoverflow.com/questions/798 ... m-datatype
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»