我刚接触过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)
最后一个结果的平均值应该被创建并保存到一个新的数组中,但也可能是嵌套循环的问题,但我假设这是不能避免的?
也许有人有一个很好的提示,我应该往哪个方向去提高性能?
1条答案
按热度按时间igetnqfo1#
这里的基本思想是来自HDF5文件的阵列应当被处理以获得该阵列中8个不同值的平均值,
所以最后我想得到一个大小为(4,3000000,3,2)的数组,它包含orig数组中8个值的平均值,其余的应该是相同的,
但是为了接触需要平均的所有8个值,我进入循环并分离它们,
如果避免了最后一步,并且避免了np.mean和use,那么在[8,2]数组上循环可以提供一点加速,但是只有一点...