在python中将数组拆分为子数组

时间:2016-01-30 19:45:39

标签: python numpy

嗨,我是编程和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']])

我真的很感激这方面的任何建议。

2 个答案:

答案 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函数,如果数据已经排序,它将为您处理分组逻辑。我提到了最后两个(mapgroupby),因为我怀疑你的数据集可能很大,性能可能是个问题。