嗨,我是编程和python编程的新手。
我有一个使用numpy.getfromtxt
导入的制表符分隔的txt文件,它看起来像
[['chr' 'start' 'end' 'name' 'score' 'strand']
['chr1' '822979' '822980' 'CLL6.08_1_snv' '88.2' '+']
...,
['chrX' '153986959' '153986960' 'CLL6.08_2678_snv' '500' '+']]
我想在具有不同染色体的子阵列中分割这些数据,如
Chr1, Chr2 ...
我正在尝试这样的事情但是出现语法错误。我试图这样做,因为我想有条件地提取每个染色体数据。
import numpy as np
data=np.genfromtxt("CLL608.txt",delimiter ="\t",dtype=None,skip_header=0)
subarray=(['Chr1':data[data[:,0]=='chr1'], 'Chr2':data[data[:,0]=='chr2']])
我真的很感激这方面的任何建议。
答案 0 :(得分:0)
您无法在列表[]中建立关联,您必须使用字典{}
>>> subarray=({'Chr1':'bla'=='blu'})
>>> print subarray
{'Chr1': False}
答案 1 :(得分:0)
创建一个dict
- ionary,它接受一个字符串(或任何可哈希的对象)并返回一个任意值。用它来映射你的' chr'仅包含那些记录的子数组的名称:
sublists = {} # empty dict
for record in data:
key = record[0] # 'chr1' or whatever
if key in sublists: # already seen it?
sublists[key].append(record)
else:
sublists[key] = [record] # start new sublist
你可以通过在Python中了解整个"我希望我的字典具有新密钥的默认值来加快速度。问题出现很多,并且有一些标准的解决方案:
sublists = {}
for record in data:
key = record[0]
sublists.get(key, list()).append(record)
list()
创建一个新的空列表。空列表或以前存在的列表都附加了record
。
最后,通过识别迭代列表并完成一件事就可以很好地利用map
函数,从而加快速度。虽然通常使用结果你正在做的事情,但是使用地图。
sublists = {}
map(data, lambda r: sublists.get(r[0], list()).append(r))
最后,如果您的数据恰好在键值上排序,您可以使用itertools.groupby
函数,如果数据已经排序,它将为您处理分组逻辑。我提到了最后两个(map
和groupby
),因为我怀疑你的数据集可能很大,性能可能是个问题。