我将假设您的矩阵在列表列表中,并向您展示如何开始。(但是,正如我在评论中提到的那样,如果您将矩阵放在 numpyarray或matrix中,这一切都会容易得多,而且速度也更快。)
如果您只是将该值作为一个大的多行字符串,则可以将其转换为浮点列表,如下所示:
m = [[float(col) for col in line.split()] for line in s.splitlines()]
现在,通过“根据第 6 列对这些数字进行分类”,听起来您想要按该列的整数值对它们进行分组。
Python 附带了一个groupby函数,可以在这里完成大部分您想要的操作,但您必须先对数据进行排序。
在 Python 中,排序和分组以及相关函数总是让你传递一个关键函数。您不必对第 6 列进行排序和分组,您可以使用第 6 列作为键对整行进行排序和分组。
但实际上,您不想使用第 6 列的值作为键,您想使用第 6 列的整数值。对于前者,您将使用itemgetterstdlib 中的函数,但要执行更复杂的操作,您最好为它编写一个函数:
def keyfunc(row):
return int(row[5])
groups = groupby(sorted(data, key=keyfunc), key=keyfunc)
(如果您重复执行此操作,您可能想要编写一个包装函数,该函数使用相同的键对分组进行排序,因此您不必重复自己并弄错。)
这给你的是一个内部带有迭代器的迭代器,这有点难以打印出来:
[(k, list(g)) for k, g in groups]
......但你得到的是:
[(68,
[[3917.0, 1.0, -0.662261, 25.148, 22.9354, 68.8076],
[3919.0, 1.0, -9.56836, -23.3265, -61.953, 68.8357]]),
(69,
[[3918.0, 1.0, 12.7649, 18.7451, 7.68473, 69.0063],
[3920.0, 1.0, 11.6292, 31.6525, -29.3697, 69.1372],
[3921.0, 2.0, 26.4837, -66.7897, 12.0257, 69.2282],
[3922.0, 1.0, -9.81652, 14.3788, 9.38343, 69.1217],
[3923.0, 2.0, 39.931, -88.1879, 109.498, 69.1604],
[3924.0, 1.0, 4.5502, 3.53887, -6.59604, 69.486],
[3925.0, 2.0, 13.6801, -24.6628, -5.7568, 69.9398]]),
(70, [[3926.0, 1.0, -10.5635, 7.05517, -8.82785, 70.2263]])]
因此,每个k都是类别分组的整数,每个都是该类别中g的所有行(按排序顺序)。
(请注意,因为groups是一个迭代器,如果你print这样做,groups现在将是空的。)
这解决了你的第一个问题,我认为你的第二个问题大部分时间(我不确定你到底想要什么)。
第三,首先您需要遍历组:
for k, g in groups:
如果您要循环遍历该组多次,您想立即创建一个列表,然后遍历该列表。
对于每个组,您希望对多个列进行一些统计。最简单的方法是使用一个为您处理所有数学问题的模块。PyPI 上的stats模块是一个不错的选择,特别是现在(稍作改动)它可能最终会出现在即将发布的 Python 版本的标准库中。
但我只会显示平均值,因为那是微不足道的。
所以:
def mean(sequence):
return sum(sequence) / len(sequence)
for k, g in groups:
rows = list(g)
print(k)
for column_index in 2, 3, 4:
column = [row[column_index] for row in rows]
print(mean(column))
这段代码可能很多地方并不能满足您的需要,但希望它足以让您入门,并在遇到困难时提出更具体的问题。