熊猫groupby:有效地提取索引

时间:2018-07-01 00:35:08

标签: python pandas numpy pandas-groupby point-clouds

我正在尝试有效地将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替代方法?

0 个答案:

没有答案
相关问题