遍历Python 2D数组分组列数据以获得总计

时间:2018-06-21 20:26:32

标签: python arrays numpy iteration grouping

我有一个按列搜索1s组的2D numpy数组,这非常简单,实际上是1s和0s的矩阵:

groups = [list(c) for c in mit.consecutive_groups((mit.locate(data[:, 2])))]

在这里,它仅查看第3列,我想从中获取一个按字典对整个数组求和的值的字典。我要这样做,以便有一个字典可以显示给定组长度的出现次数。我在弄清楚如何在单个列上执行此操作时遇到了麻烦,更不用说要为所有合并的列都获得相同的值,而跳过第一列。

我可以使用此代码段获取一组开始的索引与值的长度的键值对。但是我想得到的是组长度的键,其值为发生的总数。

d = {group[0]: len(group) for group in groups}

无论如何,无论有没有条件,我都想不着重写它,即使有条件,即使是一列,我也无法修改它,更不用说修改我的初始代码行以使我能够在整个矩阵中做到这一点。

这是输入数据的示例:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
20 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
30 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0
40 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
50 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
60 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
70 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0
80 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

理想情况下,我还需要知道它是否位于数据集的末尾,因为它会被切断。因此,将我一直使用的方法结合起来并不能满足我的需要,而其他一些类似的方法可能是最好的方法。我根本找不到办法,整个周末都在努力。谢谢。

1 个答案:

答案 0 :(得分:0)

这应该对输入数据执行所需的排序/转换。还将在数据末尾提供一个1的数组,以供参考。

dataarray = numpy.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[20, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[30, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0],
[80, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[90, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

padded = numpy.pad(dataarray,((1,1),(0,0)), 'constant')
colinds, rowinds = numpy.where((padded[:-1] != padded[1:]).T)
lengths = rowinds[1::2] - rowinds[::2]
colinds, rowinds, = colinds[::2], rowinds[::2]
parsed = list(zip(colinds, rowinds, lengths))
lenind = []
d = {}
for row in parsed:
    if(row[-1] not in lenind):
        lenind.append(row[-1])

for i in sorted(lenind):
    d[i] = 0

for row in parsed:
    d[row[-1]] += 1

od = collections.OrderedDict(sorted(d.items()))

for line in parsed:
    if(line[1] + line[2] == len(dataarray)-1):
        print(line)

parsedarray = numpy.array(parsed)

endflips = [j for j in parsedarray if j[1] + j[2] >= len(dataarray)]

数据应以“列号,行号,长度”的格式显示,其中长度是该列中一行的1的数量。