Как читать данные генератора в виде массива
def laser_callback(self, laserMsg):
cloud = self.laser_projector.projectLaser(laserMsg)
gen = pc2.read_points(cloud, skip_nans=True, field_names=('x', 'y', 'z'))
self.xyz_generator = gen
print(gen)
Я пытаюсь преобразовать данные лазера в данные pointcloud2, а затем отобразить их с помощью matplotlib.pyplot. Я пробовал обходить отдельные точки в генераторе, но это занимает много времени. Вместо этого я хотел бы преобразовать их в массив Numpy, а затем построить его. Как мне это сделать?
1 ответ
Взгляните на некоторые из этих постов, которые, кажется, отвечают на основной вопрос "преобразовать генератор в массив":
- Как мне построить массив из генератора?
- Как построить np.array с fromiter
- Как заполнить двумерный массивный массив Python значениями из генератора?
- Numpy Fromiter с генератором списка
Не зная точно, что возвращает ваш генератор, лучшее, что я могу сделать, это предоставить несколько общий (но не особенно эффективный) пример:
#!/usr/bin/env -p python
import numpy as np
# Sample generator of (x, y, z) tuples
def my_generator():
for i in range(10):
yield (i, i*2, i*2 + 1)
i += 1
def gen_to_numpy(gen):
return np.array([x for x in gen])
gen = my_generator()
array = gen_to_numpy(gen)
print(type(array))
print(array)
Выход:
<class 'numpy.ndarray'>
[[ 0 0 1]
[ 1 2 3]
[ 2 4 5]
[ 3 6 7]
[ 4 8 9]
[ 5 10 11]
[ 6 12 13]
[ 7 14 15]
[ 8 16 17]
[ 9 18 19]]
Опять же, я не могу комментировать эффективность этого. Вы упомянули, что построение графика путем считывания точек непосредственно из генератора занимает много времени, но преобразование в массив Numpy все равно потребует прохождения всего генератора для получения данных. Вероятно, было бы гораздо эффективнее, если бы используемая реализация лазера в pointcloud могла бы предоставлять данные непосредственно в виде массива, но это вопрос к форуму ROS Ответы (я заметил, что вы уже задали этот вопрос там).