我有一个相对较大的数据文件,大约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
基本上,有两个独立变量X
,Y
和一个依赖Z
。数据通过以下方式加载到NumPy
数组中:
data = np.loadtxt('datafile.txt', skiprows = 2)
因此X
,Y
和Z
列分别对应data[:,0]
,data[:,1]
和data[:,2]
。 X
列由常见的floats
部分组成,这些部分提前未知但按升序排列,如示例(.10000E+05,.16730E+05,...,n)
中所示,我希望将其切片具有常见X
值的新数组。
如上所述切片此数组的有效方法是什么?
我尝试过一种方法,它依赖于遍历X
列并检查相邻元素是否相同,但这需要在Python中长时间运行。
答案 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:])