迭代Python 2D数组分组列d

2024-05-17 16:36:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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

理想情况下,我还需要能够判断它是否在数据集的末尾,因为它会被切断。所以,结合我一直使用的方法,这并不能给出我所需要的,和一些其他类似的方法可能是最好的方法。我简直找不到办法,整个周末都在努力。谢谢。你知道吗


Tags: 数据方法代码innumpyfor字典mit
1条回答
网友
1楼 · 发布于 2024-05-17 16:36:20

这应该对输入数据执行所需的排序/转换。它还将提供出现在数据末尾的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的数目。你知道吗

相关问题 更多 >