如何将生成器数据读取为 numpy 数组
how to read generator data as numpy array
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 数组,然后绘制它。我该怎么做?
看看其他一些帖子,它们似乎回答了 "convert a generator to an array" 的基本问题:
- How do I build a numpy array from a generator?
- How to construct an np.array with 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 数组仍然需要通过整个生成器来获取数据。如果您使用的激光到点云实现可以直接将数据作为数组提供,那可能会更有效率,但这是 ROS Answers 论坛的问题(我注意到你 already asked this there)。
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 数组,然后绘制它。我该怎么做?
看看其他一些帖子,它们似乎回答了 "convert a generator to an array" 的基本问题:
- How do I build a numpy array from a generator?
- How to construct an np.array with 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 数组仍然需要通过整个生成器来获取数据。如果您使用的激光到点云实现可以直接将数据作为数组提供,那可能会更有效率,但这是 ROS Answers 论坛的问题(我注意到你 already asked this there)。