我正在尝试有效地将3D点云拆分为许多2D切片/片段。
使用numpy的searchsorted()和pandas groupby()函数的组合,我能够以令人满意的速度将数据分为几组。
例如:
import numpy as np
import pandas as pd
import time
scale=100
n_points= 1000000
n_tiles = 1000000
pos = np.empty((n_points,3))
pos[:,0]=np.random.random(n_points)*scale
pos[:,1]=np.random.random(n_points)*scale
pos[:,2]=np.random.random(n_points)
df = pd.DataFrame(pos)
# create bounds for each segment
min_bound,max_bound = 0,scale
x_segment_bounds,xstep = np.linspace(min_bound, max_bound, num=n_tiles**0.5,retstep = True)
x_segment_bounds[0]=x_segment_bounds[0]+xstep/2
y_segment_bounds,ystep = np.linspace(min_bound, max_bound, num=n_tiles**0.5,retstep=True)
y_segment_bounds[0]=y_segment_bounds[0]+ystep/2
# sort into bins
time_grab = time.clock()
bins_x = np.searchsorted(x_segment_bounds, pos[:, 0])
bins_y = np.searchsorted(y_segment_bounds, pos[:, 1])
print("Time for binning: ", time.clock()-time_grab)
df["bins_x"] = bins_x.astype(np.uint16)
df["bins_y"] = bins_y.astype(np.uint16)
# group points
time_grab = time.clock()
segments = df.groupby(['bins_x', 'bins_y'])
print("Time for grouping: ", time.clock()-time_grab)
产生:
Time for binning: 0.1390
Time for grouping: 0.0043
我遇到的问题是有效访问属于熊猫groupby对象中每个组的点索引。
例如,遍历每个组的效率很低:
segment_indices = []
for i,segment in enumerate(segments):
segment_indices.append(segment[1].index.values)
大约需要70秒。
我发现了这种检索索引的方法:
segments = df.groupby(['bins_x', 'bins_y']).apply(lambda x: x.index.tolist())
大约需要10秒钟,但是与合并和分组功能相比,它仍然相当慢。由于我只是试图将数据复制到新的数组或列表中,而不实际对其执行任何计算,因此我期望效率更高。我希望速度至少类似于合并和分组操作。
我很好奇是否有一种更有效的方法可以从groupby对象中提取索引(或任何信息)吗?另外,还有另一种不使用大熊猫的分割/分组方法,例如numpy或scipy替代方法?