numpy数组分区性能差

zzlelutf  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(95)

我刚接触过numpy数组,遇到了性能问题,
处理3M行需要大约8分钟,我想知道,如下所示的numpy数组的分区是否是处理numpy数组结果的最佳方式,

import re, math, time
   import numpy as np
   from tqdm import tqdm

   hdf5_array=np.random.rand(3000000, 3, 4, 8, 1, 1, 1, 2)
   ndarray = np.squeeze(hdf5_array)
   print (hdf5_array.shape, ndarray.shape)
   num_elm = ndarray.shape[0]
   num_iter = ndarray.shape[2]
   num_int_points = ndarray.shape[3]
   res_array = np.zeros([num_iter, num_elm, 3, 2], dtype=np.float32)
   for i, row in enumerate(tqdm(ndarray)):
           for xyz in range(3):
               xyz_array = np.squeeze(np.take(row,[xyz],axis=0),axis=0)
               for iter in range(num_iter):
                   iter_row = np.squeeze(np.take(xyz_array,[iter],axis=0), axis=0)
                   mean_list = np.mean(iter_row, axis=0)
   print (type(res_array), res_array.ndim, res_array.dtype, res_array.shape)

最后一个结果的平均值应该被创建并保存到一个新的数组中,但也可能是嵌套循环的问题,但我假设这是不能避免的?
也许有人有一个很好的提示,我应该往哪个方向去提高性能?

igetnqfo

igetnqfo1#

这里的基本思想是来自HDF5文件的阵列应当被处理以获得该阵列中8个不同值的平均值,
所以最后我想得到一个大小为(4,3000000,3,2)的数组,它包含orig数组中8个值的平均值,其余的应该是相同的,
但是为了接触需要平均的所有8个值,我进入循环并分离它们,
如果避免了最后一步,并且避免了np.mean和use,那么在[8,2]数组上循环可以提供一点加速,但是只有一点...

sum_r = 0.0 
    sum_i = 0.0
    for p in range(num_int_points):
        sum_r = sum_r + iter_row[p][0]
        sum_i = sum_i + iter_row[p][1]
    res_array[iter, i, xyz, 0:2] = [sum_r / float(num_int_points), sum_i / float(num_int_points)]

相关问题