如何将生成器数据读取为numpy数组

时间:2017-10-31 16:39:48

标签: python-2.7 numpy ros rospy

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 个答案:

答案 0 :(得分:1)

看看其他一些似乎回答“将生成器转换为数组”的基本问题的帖子:

在不确切知道您的生成器返回的情况下,我能做的最好的事情是提供一个有点通用(但不是特别有效)的示例:

#!/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 Answers论坛的一个问题(我注意到你already asked this there)。