1

我有一个包含多个数据点的数据文件,我想按特定顺序绘制。这是示例数据文件:

cop   94.0528    313     441
cpr   225.172    726     747
ent   444.786    926     939
fsh   256.038    743     754
fsp   43.7764    340     356
pbp   343.708    825     834
rho   426.497    858     886
sca   342.431    427     872

我目前正在以我设置示例的方式将它们绘制在彼此下方。如何将我的 python 脚本中这些数据记录的顺序更改为指定的顺序?我已经尝试将它放入一个数组中。在这里的这个问题:如何使用matplotlib控制条形图中的记录顺序?

所以从现在开始我的下一个问题是,我可以做完全相同的事情,但是使用基于文本的排序 aaray 吗?

所以我要输入的是这样的:

posarray = (crp, 2), (cop,1)

编辑: posarray 将用输出数组中的 posarray[0] 中的文本表示记录的位置。crp 将在第二个位置结束, cop 在第一个位置,依此类推。

它会给我什么

cop   94.0528    313     441
cpr   225.172    726     747

最好的办法是使用某种插入,这样如果我忘记在排序数组中提及一个项目,它就会沉到底部。

4

1 回答 1

0

如您上一个问题的答案中所述,您可以通过一些索引技巧来实现您想要的。

让我们假设您有一个数组的 numpy 表示,如下所示:

a = array([('cop', 94.0528, 313, 441), ('cpr', 225.172, 726, 747),
           ('ent', 444.786, 926, 939), ('fsh', 256.038, 743, 754),
           ('fsp', 43.7764, 340, 356), ('pbp', 343.708, 825, 834),
           ('rho', 426.497, 858, 886), ('sca', 342.431, 427, 872)], 
          dtype=[('f0', '|S3'), ('f1', '<f8'), ('f2', '<i8'), ('f3', '<i8')])

您可以轻松获取第一列的列表:

>>> fields = list(a['f0'])

现在,定义一个按您需要排序的字段列表,例如:

>>> new_order = ['cpr', 'cop', 'ent', 'fsh', 'fsp', 'rho', 'pbp', 'sca']

您可以使用方法和一些列表理解来获取列表中每个项目的位置new_orderfieldsindex

>>> indices = [fields.index(i) for i in new_order]
[1, 0, 2, 3, 4, 6, 5, 7]

(你可以理解为什么我们需要fields一个列表,因为数组没有index方法)

而已。您现在可以使用列表重新排列您的数组indices

>>> a[indices]
array([('cpr', 225.172, 726, 747), ('cop', 94.0528, 313, 441),
       ('ent', 444.786, 926, 939), ('fsh', 256.038, 743, 754),
       ('fsp', 43.7764, 340, 356), ('rho', 426.497, 858, 886),
       ('pbp', 343.708, 825, 834), ('sca', 342.431, 427, 872)], 
      dtype=[('f0', '|S3'), ('f1', '<f8'), ('f2', '<i8'), ('f3', '<i8')])
于 2012-08-29T21:54:24.303 回答