我有以下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:]
什么是将数组分解为相等/相同值的较小数组的有效方法?
答案 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
属性将一系列列表转换为列表列表。