【问题标题】:how to read generator data as numpy array如何将生成器数据读取为 numpy 数组
【发布时间】:2017-10-31 16:39:47
【问题描述】:
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 数组,然后绘制它。我该怎么做呢?

【问题讨论】:

    标签: python-2.7 numpy ros rospy


    【解决方案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 数组仍然需要通过整个生成器来获取数据。如果您使用的激光到点云的实现可以直接以数组的形式提供数据,那可能会更有效,但这是 ROS Answers 论坛的一个问题(我注意到你 already asked this there)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-04
      • 2018-07-21
      • 2021-02-13
      • 2017-04-15
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多