Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于二维阵列的三维numpy切片的平均值_Python_Arrays_Numpy_Slice_Mean - Fatal编程技术网

Python 基于二维阵列的三维numpy切片的平均值

Python 基于二维阵列的三维numpy切片的平均值,python,arrays,numpy,slice,mean,Python,Arrays,Numpy,Slice,Mean,我试图计算第1轴上两个索引之间的3D数组的平均值。起始索引和结束索引因单元而异,由两个单独的二维阵列表示,它们的形状与三维阵列的切片相同 我已经成功地实现了一段代码,它在我的3D阵列的像素中循环,但是对于形状为(70550350)的阵列,这种方法的速度非常慢。是否有方法使用numpy或xarray对操作进行矢量化(数组存储在xarray数据集中) 下面是我想优化的一个片段: #我的3D光栅包含值;形状=(时间,x,y) 值=np.rand.rand(10,55,60) #二维光栅,包含用于平均的

我试图计算第1轴上两个索引之间的3D数组的平均值。起始索引和结束索引因单元而异,由两个单独的二维阵列表示,它们的形状与三维阵列的切片相同

我已经成功地实现了一段代码,它在我的3D阵列的像素中循环,但是对于形状为
(70550350)
的阵列,这种方法的速度非常慢。是否有方法使用
numpy
xarray
对操作进行矢量化(数组存储在
xarray
数据集中)

下面是我想优化的一个片段:

#我的3D光栅包含值;形状=(时间,x,y)
值=np.rand.rand(10,55,60)
#二维光栅,包含用于平均的起始索引
start_index=np.random.randint(0,4,size=(values.shape[1],values.shape[2]))
#包含用于平均的末端索引的二维光栅
end_index=np.random.randint(5,9,size=(values.shape[1],values.shape[2]))
#初始化将包含结果的数组
mean_数组=np.zeros_like(值[0,:,:])
#在三维光栅上循环以计算轴0上索引之间的平均值
对于范围(0,values.shape[1])中的i:
对于范围(0,值.shape[2])中的j:
mean_数组[i,j]=np.mean(值[start_index[i,j]:end_index[i,j],i,j],轴=0)

不使用循环的一种方法是将不想使用的项归零,计算剩余项的总和,然后除以非零项的数量。例如:

i=np.arange(values.shape[0])[:,无,无]
平均数组_2=np。其中((i>=开始_索引)和(i<结束_索引),值为0。求和(0)/(结束_索引-开始_索引)
np.allclose(平均数组,平均数组2)
#真的

注意,这假设索引在
0的范围内,我的值通常在-10到+10之间。如果我理解正确,我必须将它们从0标准化为
值。形状[0]
,进行运算并将平均值转换回初始范围?不,值可以是任何值。开始和结束索引必须在范围内,这两种方法才能产生相同的结果。感谢您提供的信息,我测试了您的代码,效果很好。它比循环(600倍)快得多。有趣的是,它比使用numba jit循环慢2倍。但话说回来,这是相同的数量级,正如我所指出的,nuba抛出错误时更难调试。