如何使用numpy.loadtxt从78000列的CSV中选取指定列块?
如何用numpy.loadtxt选取多块不连续的列?
我有一个包含78000列的CSV文件,需选取第2-100列、102-200列及最后300列,跳过其余列。已使用numpy.loadtxt选取列范围:
numpy.loadtxt(input_file_name, delimiter=",", skiprows = 1, usecols=range(1,99)),请问如何类似地选取多块列,例如:numpy.loadtxt(input_file_name, delimiter=",", skiprows = 1, usecols=(range(1,99),range(101,199),range(74999,77999)))?
嗨,这个问题很常见!直接把多个range放进元组传给usecols是行不通的,因为numpy.loadtxt的usecols参数需要的是一个扁平的一维可迭代对象(比如列表、数组),而不是嵌套的元组。我们只需要把这些分散的列范围合并成一个单一的序列就可以了,下面给你两种实用的方法:
方法一:用列表合并多个range
这种方法简单直观,适合列数不多的场景:
import numpy as np # 先算清楚最后300列的起始索引:总列数78000,索引从0开始,所以最后300列是77700到77999 last_300_start = 78000 - 300 # 把多个range转换成列表后合并,注意range是左闭右开的! # 第2-100列对应索引1到99 → 要用range(1, 100)(之前你的range(1,99)只会到索引98,少了一列) # 第102-200列对应索引101到199 → 要用range(101, 200) cols_to_use = list(range(1, 100)) + list(range(101, 200)) + list(range(last_300_start, 78000)) # 加载数据 data = np.loadtxt(input_file_name, delimiter=",", skiprows=1, usecols=cols_to_use)
方法二:用numpy数组合并(更高效)
如果你的列数特别多,用numpy的concatenate合并数组会更高效:
import numpy as np last_300_start = 78000 - 300 # 用np.arange生成数组,再合并 cols_to_use = np.concatenate([ np.arange(1, 100), # 第2-100列 np.arange(101, 200), # 第102-200列 np.arange(last_300_start, 78000) # 最后300列 ]) data = np.loadtxt(input_file_name, delimiter=",", skiprows=1, usecols=cols_to_use)
这里要特别提醒你注意range和np.arange的左闭右开特性:比如你要选第2到100列(共99列),必须用range(1, 100),而不是range(1,99)——后者只会包含索引1到98,对应第2到99列,少了一列哦。
内容的提问来源于stack exchange,提问作者SGh
相关产品推荐
相关产品推荐

