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

时间:2018-07-10 02:58:41

标签: python arrays

我有以下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:]

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

3 个答案:

答案 0 :(得分:3)

浮点数和整数的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方法。

答案 1 :(得分:2)

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])]

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

答案 2 :(得分:0)

这是使用熊猫的一种方法:

import pandas as pd 

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

说明:
首先,将array转换为Series,然后使用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属性将一系列列表转换为列表列表。