基于第一列

时间:2015-05-08 15:59:42

标签: python arrays numpy

我有一个相对较大的数据文件,大约10GB,有三列,看起来像:

X             Y    Z
----          ---- ----
.10000E+05    100  35
.10000E+05    101  45
.             .    .
.             .    .
.             .    .
.10000E+05    400  45
.16730E+05    100  43
.16730E+05    101  25
.             .    .
.             .    .
.             .    .
.16730E+05    400  57
.             .    .
.             .    .
.             .    .
n             100  34
n             101  54
.             .    .
.             .    .
.             .    .
n             400  45

基本上,有两个独立变量XY和一个依赖Z。数据通过以下方式加载到NumPy数组中:

data = np.loadtxt('datafile.txt', skiprows = 2)

因此XYZ列分别对应data[:,0]data[:,1]data[:,2]X列由常见的floats部分组成,这些部分提前未知但按升序排列,如示例(.10000E+05,.16730E+05,...,n)中所示,我希望将其切片具有常见X值的新数组。

如上所述切片此数组的有效方法是什么?

我尝试过一种方法,它依赖于遍历X列并检查相邻元素是否相同,但这需要在Python中长时间运行。

3 个答案:

答案 0 :(得分:3)

numpy有一些功能,可以帮助您完成任务:

borders = data[0,:].searchsorted(numpy.unique(data[0,:]))
part0 = data[borders[0]:borders[1]]

但我并不建议将大阵列分开,而是在需要的时候用borders索引它。

答案 1 :(得分:2)

我不知道为什么你需要这个,但切割大阵列并创建许多较小的阵列可能不是你最好的选择。

如果您真的想这样做,可以尝试获取第一列的唯一值,并为每个唯一值拆分数组。

uniq_vals = np.unique(data[:,1])
for u in uniq_vals:
    splitted = data[data[:,1]==u]
    # do whatever you want with `splitted`

这将在一行中创建一个列表列表

[data[data[:,1]==u] for u in np.unique(data[:,1])]

答案 2 :(得分:0)

这可以使用numpy_indexed包有效地完成(免责声明:我是它的作者):

import numpy_indexed as npi
npi.group_by(data[:, 0]).split(data[:, 1:])