python - 基于另一个数组

时间:2016-10-25 02:12:53

标签: python arrays sorting

我有一个数据数组外观,例如:

data = [
    [1.4, 2.6, 7.3, 4.2],
    [1.1, 2.0, 6.4, 1.0],
    [5.1, 6.2, 5.3, 9.9]
]

和另一个带有类标签的数组:

class_labels = ['a', 'b', 'a', 'b']

每个类标签对应于数据数组的每个元素中的某些浮点数(例如,类'a'对应于来自1.4的{​​{1}}和7.3,{{来自data[0]的{​​1}}和1.1以及来自6.4的{​​{1}}和data[1]

我从其他帖子中了解如何根据另一个数组对一个数组进行排序,但是是否可以按字母顺序对5.1数组进行排序,还可以对数据数组的每个元素中的相应浮点数进行排序? / p>

我可能完全不知道这个错误 - 如果我想稍后能够从每个元素访问某些浮点数(即只有与给定类标签相对应的浮点数),那么这是可能的吗?

感谢您的任何建议!

3 个答案:

答案 0 :(得分:1)

可以根据另一个的排序顺序对数组进行排序,但我建议使用字典,因为它可能更容易使用。类似的东西:

data_by_class = {label:[] for label in set(class_labels)}
for row in data:
    for idx in range(len(row)):
        data_by_class[class_labels[idx]].append(row[idx])

会导致

{ 'a':[1.4, 7.3, 1.1, 6.4, 5.1, 5.3], 'b': [2.6, 4.2, 2.0, 1.0, 6.2, 9.9] }

答案 1 :(得分:1)

您可能希望以不同方式整理数据,尽管有点不清楚您正在寻找的内容。

如果我们假设您仍然喜欢基于行的数据,其中每行包含(可能是多个)不同类的观察,那么您可以将数据重新组织为字典列表

import itertools
row_dicts = [{k: [x[1] for x in v] 
              for k, v in itertools.groupby(
                  sorted(zip(class_labels, row)), key=lambda x: x[0])}
             for row in data]

现在您的数据显示为:

>>> row_dicts
[{'a': [1.4, 7.3], 'b': [2.6, 4.2]},
 {'a': [1.1, 6.4], 'b': [1.0, 2.0]},
 {'a': [5.1, 5.3], 'b': [6.2, 9.9]}]

您可以从行a

中发现标签为1的所有观察结果
>>> row_dicts[1]["a"]
[1.1, 6.4]

答案 2 :(得分:1)

让我们从您的数据开始

In [1]: data = [
   ...:     [1.4, 2.6, 7.3, 4.2],
   ...:     [1.1, 2.0, 6.4, 1.0],
   ...:     [5.1, 6.2, 5.3, 9.9]
   ...: ]
In [2]: labels = ['a', 'b', 'a', 'b']

压缩它以将两个数组合并为一个对象

In [3]: zip(labels, *data)
Out[3]: 
[('a', 1.4, 1.1, 5.1),
 ('b', 2.6, 2.0, 6.2),
 ('a', 7.3, 6.4, 5.3),
 ('b', 4.2, 1.0, 9.9)]

现在对结果进行排序:

In [4]: sorted(zip(labels, *data))
Out[4]: 
[('a', 1.4, 1.1, 5.1),
 ('a', 7.3, 6.4, 5.3),
 ('b', 2.6, 2.0, 6.2),
 ('b', 4.2, 1.0, 9.9)]

然后解压缩回来:

In [6]: zip(*sorted(zip(labels, *data)))
Out[6]: 
[('a', 'a', 'b', 'b'),
 (1.4, 7.3, 2.6, 4.2),
 (1.1, 6.4, 2.0, 1.0),
 (5.1, 5.3, 6.2, 9.9)]

最后用丑陋的 oneliner

获得结果
In [7]: [list(x) for x in zip(*sorted(zip(labels, *data)))[1:]]
Out[7]: [[1.4, 7.3, 2.6, 4.2], [1.1, 6.4, 2.0, 1.0], [5.1, 5.3, 6.2, 9.9]]

如果您希望使代码更具可读性,可以拆分oneliner