numpy 制作基于唯一列的子数组

安德鲁·霍洛维茨

我有一个示例数组,看起来像array = np.array([[1,1,0,1], [0,1,0,0], [1,1,1,0], [0,0,1,2], [0,1,3,2], [1,1,0,1], [0,1,0,0]])......

array([[1, 1, 0, 1],
       [0, 1, 0, 0],
       [1, 1, 1, 0],
       [0, 0, 1, 2],
       [0, 1, 3, 2],
       [1, 1, 0, 1],
       [0, 1, 0, 0]])

考虑到这一点,我想根据前两列将这个数组重新格式化为子数组。使用如何根据列拆分 numpy 数组?作为参考,我将这个数组变成了一个数组列表,其中...

df = pd.DataFrame(array)
df['4'] = df[0].astype(str) + df[1].astype(str)
df['4'] = df['4'].astype(int)
arr = df.to_numpy()
y = [arr[arr[:,4]==k] for k in np.unique(arr[:,4])]

y在哪里...

[array([[0, 0, 1, 2, 0]]),
 array([[0, 1, 0, 0, 1],
        [0, 1, 3, 2, 1],
        [0, 1, 0, 0, 1]]),
 array([[ 1,  1,  0,  1, 11],
        [ 1,  1,  1,  0, 11],
        [ 1,  1,  0,  1, 11]])]

这工作正常,但y运行时间太长每行所需的时间呈指数增长。我正在处理数亿行,y = [arr[arr[:,4]==k] for k in np.unique(arr[:,4])]从时间的角度来看是不切实际的。

关于如何加快速度的任何想法?

保罗·C

使用numpy_indexed图书馆怎么样

import numpy as np
import numpy_indexed as npi

a = np.array([[1, 1, 0, 1],
       [0, 1, 0, 0],
       [1, 1, 1, 0],
       [0, 0, 1, 2],
       [0, 1, 3, 2],
       [1, 1, 0, 1],
       [0, 1, 0, 0]])

key = np.dot(a[:,:2], [1, 10])
y = npi.group_by(key).split_array_as_list(arr)

输出

y
[array([[0, 0, 1, 2]]), 
 array([[0, 1, 0, 0],
        [0, 1, 3, 2],
        [0, 1, 0, 0]]),
 array([[ 1,  1,  0,  1],
        [ 1,  1,  1,  0],
        [ 1,  1,  0,  1]])]

您可以通过以下方式轻松安装该库:

> pip install numpy-indexed

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章