Python 如何在使用numpy阵列维护内存的同时提高速度?

Python 如何在使用numpy阵列维护内存的同时提高速度?,python,arrays,numpy,Python,Arrays,Numpy,我需要编写一个代码来做一个样本t检验,给定二维数组中每个条目的样本平均值(E(X))和样本第二原始矩(E(X^2)) 我有两种方法可以做到这一点,但它们都不太管用 使用numpy否决操作-对于特定大小的阵列,内存不足错误 def calc_normal_pvals(vt_sum_计数器、vt_sum_计数器): 全球NSUB vt_总和计数器=vt_总和计数器/nsubs vt_ssum_计数器=vt_ssum_计数器/nsubs 样本变量=nsubs*(vt_sum_计数器-np.平方(vt_

我需要编写一个代码来做一个样本t检验,给定二维数组中每个条目的样本平均值(E(X))和样本第二原始矩(E(X^2))

我有两种方法可以做到这一点,但它们都不太管用

  • 使用numpy否决操作-对于特定大小的阵列,内存不足错误
    def calc_normal_pvals(vt_sum_计数器、vt_sum_计数器):
    全球NSUB
    vt_总和计数器=vt_总和计数器/nsubs
    vt_ssum_计数器=vt_ssum_计数器/nsubs
    样本变量=nsubs*(vt_sum_计数器-np.平方(vt_sum_计数器))/(nsubs-1)
    t_数组=np.除法(vt_求和计数器,(np.sqrt(样本变量/nsubs)))
    pvals=t.sf(t_阵列,nsubs-1)
    pvals[np.isnan(pvals)]=0
    返回pvals
    
  • 普通for循环方法-比较起来需要很多时间
  • def calc_normal_pvals(vt_sum_计数器,vt_sum_计数器,tail=1):
    全球NSUB
    五、 T=vt\u和\u计数器形状
    pvals=np.零((V,T))
    对于范围(V)内的i:
    对于范围(T)内的j:
    sigma=((vt_sum_计数器[i,j]/nsubs-(vt_sum_计数器[i,j]/nsubs)**2)/(nsubs-1))**0.5
    如果(西格玛!=0):
    pvals[i,j]=t.sf(vt_总和计数器[i,j]/(nsubs*σ),nsubs-1)
    返回pvals
    

    输入阵列是巨大的,通常大小约为900000 X 400

    哪一行抛出内存错误?它随系统而变化。但最好的一行是“pvals=t.sf(t_数组,nsubs-1)”。问题的要点是如何更有效地编写这样的代码。你能结合这两行,使用块吗。例如,在9000 x 400阵列上进行100次迭代。由于内存管理问题,复杂操作的几次迭代通常是最优的。@hpaulj,是的,我也这么想。我想知道是否有一个很酷的numpy技巧。哪一行抛出内存错误?它随系统而变化。但最好的一行是“pvals=t.sf(t_数组,nsubs-1)”。问题的要点是如何更有效地编写这样的代码。你能结合这两行,使用块吗。例如,在9000 x 400阵列上进行100次迭代。由于内存管理问题,复杂操作的几次迭代通常是最优的。@hpaulj,是的,我也这么想。我想知道是否有一个很酷的小把戏。