我有几个numpy数组,我想构建一个分组方法,为这些数组分配组ID。然后,它将允许我根据组ID对这些数组进行索引,以对组执行操作。
例如:
有没有更高效的实现方式,最好是纯numpy? 目前瓶颈似乎在于构建一个向量,使每个组具有唯一值——目前我是通过将每个向量的值连接为字符串来实现的。 我希望这对任何数量的输入向量都有效,这些向量可以有数百万个元素。 编辑:这里是另一个测试案例:
这里,2、3、4、7组元素应该全部相同。
编辑2:添加一些基准测试。
例如:
import numpy as np
import pandas as pd
a = np.array([1,1,1,2,2,3])
b = np.array([1,2,2,2,3,3])
def group_np(groupcols):
groupby = np.array([''.join([str(b) for b in bs]) for bs in zip(*[c for c in groupcols])])
_, groupby = np.unique(groupby, return_invesrse=True)
return groupby
def group_pd(groupcols):
df = pd.DataFrame(groupcols[0])
for i in range(1, len(groupcols)):
df[i] = groupcols[i]
for i in range(len(groupcols)):
df[i] = df[i].fillna(-1)
return df.groupby(list(range(len(groupcols)))).grouper.group_info[0]
输出:
group_np([a,b]) -> [0, 1, 1, 2, 3, 4]
group_pd([a,b]) -> [0, 1, 1, 2, 3, 4]
有没有更高效的实现方式,最好是纯numpy? 目前瓶颈似乎在于构建一个向量,使每个组具有唯一值——目前我是通过将每个向量的值连接为字符串来实现的。 我希望这对任何数量的输入向量都有效,这些向量可以有数百万个元素。 编辑:这里是另一个测试案例:
a = np.array([1,2,1,1,1,2,3,1])
b = np.array([1,2,2,2,2,3,3,2])
这里,2、3、4、7组元素应该全部相同。
编辑2:添加一些基准测试。
a = np.random.randint(1, 1000, 30000000)
b = np.random.randint(1, 1000, 30000000)
c = np.random.randint(1, 1000, 30000000)
def group_np2(groupcols):
_, groupby = np.unique(np.stack(groupcols), return_inverse=True, axis=1)
return groupby
%timeit group_np2([a,b,c])
# 25.1 s +/- 1.06 s per loop (mean +/- std. dev. of 7 runs, 1 loop each)
%timeit group_pd([a,b,c])
# 21.7 s +/- 646 ms per loop (mean +/- std. dev. of 7 runs, 1 loop each)
pandas
来改进你的方法,你可以使用df = pd.DataFrame({i:ar for i, ar in enumerate(groupcols)}).fillna(-1)
来创建数据框,它会稍微快一些 :) - Ben.T