При загрузке данных вершин из файла .obj полезно временно сохранить данные вершин в обычном списке Python перед преобразованием этих данных в массив Numpy с моим пользовательским типом данных. Однако простая попытка преобразовать список в массив Python дает неожиданные результаты.
Как видно, каждый элемент списка преобразуется в полный экземпляр пользовательского типа данных путем сопоставления элемента со всеми полями вместо предполагаемого преобразования подсписков в экземпляры настраиваемых типов данных. Эту проблему можно решить, инициализируя массив заполнителей и итеративно преобразуя все элементы списка.
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)]
Хотя это работает, это выглядит несколько неуклюже и может потребовать большого количества жестко закодированных функций преобразования, если вводится несколько пользовательских типов данных.
Есть ли лучший способ добиться того же результата?>
Я использую Python для создания механизма рендеринга OpenGL и использую массивы numpy с пользовательским типом данных для хранения данных вершин. [code]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 }) [/code] При загрузке данных вершин из файла .obj полезно временно сохранить данные вершин в обычном списке Python перед преобразованием этих данных в массив Numpy с моим пользовательским типом данных. Однако простая попытка преобразовать список в массив Python дает неожиданные результаты. [code]vertex_list = [ [1.1, 2.2, 3.3, 5], [4.4, 5.5, 6.6, 7] ]
# 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)]] [/code] Как видно, каждый элемент списка преобразуется в полный экземпляр пользовательского типа данных путем сопоставления элемента со всеми полями вместо предполагаемого преобразования подсписков в экземпляры настраиваемых типов данных. Эту проблему можно решить, инициализируя массив заполнителей и итеративно преобразуя все элементы списка. [code]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)] [/code] Хотя это работает, это выглядит несколько неуклюже и может потребовать большого количества жестко закодированных функций преобразования, если вводится несколько пользовательских типов данных. Есть ли лучший способ добиться того же результата?>