我有一个数据数组外观,例如:
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>
我可能完全不知道这个错误 - 如果我想稍后能够从每个元素访问某些浮点数(即只有与给定类标签相对应的浮点数),那么这是可能的吗?
感谢您的任何建议!
答案 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