我需要使用numpy对非常大的基因组数据集进行排序.我有一个26亿浮点数的数组,维度= (868940742, 3)一旦加载并且只是坐在那里,我的机器上占用了大约20GB的内存.我有一台2015年初的13英寸MacBook Pro,配备16GB内存,500GB固态高清和3.1 GHz intel i7处理器.只是加载数组溢出到虚拟内存,但没有到我的机器遭受的程度,或者我必须停止我正在做的其他事情.
我从22个较小的(N, 2)子阵列逐步构建了这个非常大的数组.
函数使用我调用的22个子数组中的每一个FUN_1生成2个新(N, 1)数组sub_arr.
第一个输出FUN_1是通过插入来自sub_arr[:,0]数组的值生成的b = array([X, F(X)]),第二个输出是通过sub_arr[:, 0]使用数组放入二进制数来生成的r = array([X, BIN(X)]).我分别称这些输出b_arr和rate_arr.该函数返回一个3元组的(N, 1)数组:
import numpy as np
def FUN_1(sub_arr):
"""interpolate b values and rates based on position in sub_arr"""
b = np.load(bfile)
r = np.load(rfile)
b_arr = np.interp(sub_arr[:,0], b[:,0], b[:,1])
rate_arr = np.searchsorted(r[:,0], sub_arr[:,0]) # HUGE efficiency gain …Run Code Online (Sandbox Code Playgroud) 我有以下类型的基因组学文件:
$ cat test-file_long.txt
2 41647 A G
2 45895 A G
2 45953 T C
2 224919 A G
2 230055 C G
2 233239 A G
2 234130 T G
2 23454 T C
Run Code Online (Sandbox Code Playgroud)
当我使用以下简短的AWK脚本时,它不会返回所有大于if语句中使用的元素的元素:
{
a[$2]
}
END{
for (i in a){
if(i > 45895)
print i
}
}
Run Code Online (Sandbox Code Playgroud)
该脚本返回:
$ awk -f practice.awk test-file_long.txt
45953
Run Code Online (Sandbox Code Playgroud)
但是,当我使用int()更改if语句时,它返回实际上大于的行,如我所愿:
{
a[$2]
}
END{
for (i in a){
if(int(i) > 45895)
print i
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
$ awk -f practice.awk …Run Code Online (Sandbox Code Playgroud) 是否有一个快速numpy函数用于返回较大数组中的索引列表,其中它匹配较小数组的值?较小的数组是~30M值,更大的是800M,所以我想避免一个for循环的numpy.where调用.
searchsorted的问题是它会返回结果,即使它们不是完全匹配,它只是给出最接近的索引,但我只想要有完全匹配的索引
而不是这个:
>>> a = array([1,2,3,4,5])
>>> b = array([2,4,7])
>>> searchsorted(a,b)
array([1, 3, 5])
Run Code Online (Sandbox Code Playgroud)
我想要这个:
>>> a = array([1,2,3,4,5])
>>> b = array([2,4,7])
>>> SOMEFUNCTION(a,b)
array([1, 3])
Run Code Online (Sandbox Code Playgroud)
编辑:较小和较大数组中的值集始终是唯一的并且已排序.