如何将numpy数组中的相同元素移动到子数组中

Posted

技术标签:

【中文标题】如何将numpy数组中的相同元素移动到子数组中【英文标题】:how to move identical elements in numpy array into subarrays 【发布时间】:2015-10-23 18:02:16 【问题描述】:

如何有效地将相同元素从已排序的 numpy 数组移动到子数组中?

从这里:

import numpy as np     
a=np.array([0,0,1,1,1,3,5,5,5])

到这里:

a2=array([[0, 0], [1, 1, 1], [3], [5, 5, 5]], dtype=object)

【问题讨论】:

元素是否总是在输入数组中排序? 是的,我现在已经更新了问题。 【参考方案1】:

一种方法是获取数字变化的位置,并使用这些索引将输入数组拆分为子数组。要查找这些索引,您可以在微分数组上使用 np.nonzero,然后使用 np.split 进行拆分,就像这样 -

np.split(a,np.nonzero(np.diff(a))[0]+1)

示例运行 -

In [42]: a
Out[42]: array([2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 6, 6, 6])

In [43]: np.split(a,np.nonzero(np.diff(a))[0]+1)
Out[43]: 
[array([2, 2, 2, 2]),
 array([3, 3, 3, 3]),
 array([4, 4, 4, 4, 4, 4, 4]),
 array([5, 5]),
 array([6, 6, 6])]

【讨论】:

【参考方案2】:

一种方法是使用 itertools.groupby 。示例 -

result = np.array([list(g) for _,g in groupby(a)])

这也适用于普通的排序列表,而不仅仅是 numpy 数组。

演示 -

In [24]: import numpy as np

In [25]: a=np.array([0,0,1,1,1,3,5,5,5])

In [26]: from itertools import groupby

In [27]: result = np.array([list(g) for _,g in groupby(a)])

In [28]: result
Out[28]: array([[0, 0], [1, 1, 1], [3], [5, 5, 5]], dtype=object)

与其他方法的时间比较 -

In [29]: %timeit np.array([list(g) for _,g in groupby(a)])
The slowest run took 6.10 times longer than the fastest. This could mean that an intermediate result is being cached
100000 loops, best of 3: 9.86 µs per loop

In [30]: %timeit np.split(a,np.where(np.diff(a)>0)[0]+1)
10000 loops, best of 3: 29.2 µs per loop

In [31]: %timeit np.array([list(g) for _,g in groupby(a)])
100000 loops, best of 3: 10.5 µs per loop

In [33]: %timeit np.split(a,np.nonzero(np.diff(a))[0]+1)
The slowest run took 4.32 times longer than the fastest. This could mean that an intermediate result is being cached
10000 loops, best of 3: 25.2 µs per loop

【讨论】:

以上是关于如何将numpy数组中的相同元素移动到子数组中的主要内容,如果未能解决你的问题,请参考以下文章

如何在python的numpy数组中绑定相同索引的元素

python使用numpy中的equal函数比较两个numpy数组中每个位置的元素是否相同并计算相同元素的比例

numpy数组和python数组的区别

如何在 Numpy 中“压缩”几个 N-D 数组?

如何在numpy中对称地移动数组

NumPy 数组切片索引