将numpy数组分解为相同值的较小数组[Python]



我有以下numpy数组:

array=[1,1,1,1,2,2,3,3,3,5,6,6,6,6,6,6,7]

我需要将这个数组分解为具有相同值的较小数组,例如

[1,1,1,1] and [3,3,3]

我的代码如下,但它不起作用:

def chunker(seq, size):
return (seq[pos:pos + size] for pos in range(0, len(seq)-size))
counter=0
sub_arr=[]
arr=[]
for i in range(len(array)):
if(array[i]==array[i+1]):
counter+=1
else:
break
subarr=chunker(array,counter)
arr.append(sub_arr)
array=array[counter:]

将数组分解为相等/相同值的较小数组的有效方法是什么?

浮点和整数的numpy解决方案:

import numpy as np
a = np.asarray([1,1,1,1,2,2,3,3,3,5,6,6,6,6,6,6,7])
#calculate differences between neighbouring elements and get index where element changes
#sample output for index would be [ 4  6  9 10 16]
index = np.where(np.diff(a) != 0)[0] + 1
#separate arrays
print(np.split(a, index))

样本输出:

[array([1, 1, 1, 1]), array([2, 2]), array([3, 3, 3]), array([5]), array([6, 6, 6, 6, 6, 6]), array([7])]

如果你有字符串,这个方法自然不会起作用。那么您应该使用DyZ的itertools方法。

NumPy对这种分组的支持很差。我建议使用对列表进行操作的itertools

from itertools import groupby
[np.array(list(data)) for _,data in itertools.groupby(array)]
#[array([1, 1, 1, 1]), array([2, 2]), array([3, 3, 3]), 
# array([5]), array([6, 6, 6, 6, 6, 6]), array([7])]

这不一定是最有效的方法,因为它涉及到与列表的转换。

以下是使用Pandas:的方法

import pandas as pd 
(pd.Series(array)
.value_counts()
.reset_index()
.apply(lambda x: [x["index"]] * x[0], axis=1))  

说明:
首先,将array转换为一个系列,并使用value_counts()获得每个唯一条目的计数:

counts = pd.Series(array).value_counts().reset_index()
index  0
0      6  6
1      1  4
2      3  3
3      2  2
4      7  1
5      5  1

然后使用apply():重新创建每个重复的元素列表

counts.apply(lambda x: [x["index"]] * x[0], axis=1)
0    [6, 6, 6, 6, 6, 6]
1          [1, 1, 1, 1]
2             [3, 3, 3]
3                [2, 2]
4                   [7]
5                   [5]
dtype: object

如果需要,可以使用.values属性从一系列列表转换为列表列表。

最新更新