小编iso*_*eel的帖子

Python中内存高效的大块numpy数组

我需要使用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_arrrate_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)

python memory sorting performance numpy

14
推荐指数
2
解决办法
5841
查看次数

除非我使用int(),为什么AWK不将此数组索引视为数字?

我有以下类型的基因组学文件:

$ 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)

arrays bash awk

6
推荐指数
1
解决办法
212
查看次数

如果它包含较小数组中的值,则查找大数组的索引

是否有一个快速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)

编辑:较小和较大数组中的值集始终是唯一的并且已排序.

python arrays numpy

5
推荐指数
2
解决办法
1182
查看次数

标签 统计

arrays ×2

numpy ×2

python ×2

awk ×1

bash ×1

memory ×1

performance ×1

sorting ×1