0

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

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

理想情况下,我还需要能够判断它是否位于数据集的末尾,因为它会被切断。因此,结合我一直使用的方法并不能完全满足我的需要,以及其他一些类似的方法可能是最好的方法。我根本找不到办法,整个周末都在尝试。谢谢。

4

1 回答 1

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的数量。

于 2018-06-26T18:06:53.810 回答