数组排序和截断/分离它们

时间:2016-04-01 19:15:07

标签: python

我正在尝试对数组进行排序并在python中将其分开。

示例

我有一个这样的数据文件,我将导入:

x   y   z
1   3   83
2   4   38
8   1   98
3   87  93
4   1   73
1   3   67
9   9   18
1   4   83
9   3   93
8   2   47

我希望它首先看起来像这样:

x   y   z
1   3   83
1   3   67
1   4   83
2   4   38
3   87  93
4   1   73
8   1   98
8   2   47
9   9   18
9   3   93

因此x列按升序排列,然后是y列。

最后我想用这些数组构建一个数组?我能这样做吗?

所以我有:

array[0] = [[1, 3, 83],[1, 3, 67],[1, 4, 83]]
array[1] = [[2, 4, 38]]
array[2] = [[3, 87, 93]]
array[3] = [[4, 1, 73]]
array[4] = [[8, 1, 98],[8,2,47]]

依旧......

开始:

import numpy as np
import matplotlib.pyplot as plt

data_file_name = 'whatever.dat'

data=np.loadtxt(data_file_name)

2 个答案:

答案 0 :(得分:1)

这是一个numpy解决方案(假设您使用它来加载数据):

import numpy as np

data_file_name = 'whatever.dat'
data = np.loadtxt(data_file_name, 
                  skiprows=1, 
                  dtype=[('x', float), ('y', float), ('z', float)])

data.sort(axis=0, order=['x', 'y', 'z'])

unique_x_col_vals = set(row[0] for row in data)
array = {n: [list(row) for row in data if row[0] == val] 
            for n, val in enumerate(unique_x_col_vals)}

>>> array
{0: [[1.0, 3.0, 67.0], [1.0, 3.0, 83.0], [1.0, 4.0, 83.0]],
 1: [[2.0, 4.0, 38.0]],
 2: [[3.0, 87.0, 93.0]],
 3: [[4.0, 1.0, 73.0]],
 4: [[8.0, 1.0, 98.0], [8.0, 2.0, 47.0]],
 5: [[9.0, 3.0, 93.0], [9.0, 9.0, 18.0]]}

它使用字典理解来生成数组,在内部使用列表推导来根据列x提取每一行的唯一值。

我在导入数据时使用了浮点数,但如果匹配数据,也可以指定int。

答案 1 :(得分:0)

你可以使用pandas,只需几行代码:

df = pd.read_csv(txt, sep=r"\s*")
print df.sort(['x','y'], ascending=[True,True])