Python Numpy 3d阵列-规范化行

Python Numpy 3d阵列-规范化行,python,arrays,numpy,array-broadcasting,Python,Arrays,Numpy,Array Broadcasting,我一直致力于用水平暗/亮线条规范化图像数据 请在下面找到我的最小工作示例。 设一个3d阵列(三幅图像): 例如,图像#2a[:,:,1]由 [[1 1 1] [4 4 4] [7 7 7]] 并显示水平条纹。为了消除条纹,我计算了行的中位数、总体中位数和差分矩阵 row_median = np.median(a, axis=1) bg_median= np.tile(np.median(a, axis=[0,1]),(3,1)) difference_matrix= bg_median-

我一直致力于用水平暗/亮线条规范化图像数据

请在下面找到我的最小工作示例。 设一个3d阵列(三幅图像):

例如,图像#2
a[:,:,1]

[[1 1 1]
 [4 4 4]
 [7 7 7]]

并显示水平条纹。为了消除条纹,我计算了行的中位数、总体中位数和差分矩阵

row_median = np.median(a, axis=1)
bg_median= np.tile(np.median(a, axis=[0,1]),(3,1))
difference_matrix= bg_median-row_median
随后,我对图像进行迭代,并将差分矩阵应用于所有图像

for i in range(len(a)):
    a[:,:,i] = a[:,:,i] + np.tile(difference_matrix[:,i],(3,1)).T
这将给出所需的结果,例如,在
a[:,:,1]

[[4 4 4]
 [4 4 4]
 [4 4 4]]
对于大型图像和图像堆栈,此过程非常缓慢。 如果您能通过使用广播,对提高我的代码性能提出任何意见和提示,我将不胜感激

编辑: 跟进

为我解决了这个问题。

方法#1

利用
None/np.newaxis
扩展维度,而不是平铺这些中间数组,以节省内存,从而实现性能。效率。因此,这些变化将是-

diff = np.median(a, axis=[0,1]) - np.median(a, axis=1)
a += diff[:,None]
这将考虑罩下的尺寸扩展

方法#2

或者,一种更明确的跟踪dim的方法是在执行数据缩减时保留dim,从而避免使用
None
进行最终dim扩展。因此,我们可以将
keepdims
用作
True
-

diff = np.median(a,axis=(0,1),keepdims=True) - np.median(a, axis=1,keepdims=True)
a += diff

发布的解决方案对你有用吗?
diff = np.median(a, axis=[0,1]) - np.median(a, axis=1)
a += diff[:,None]
diff = np.median(a,axis=(0,1),keepdims=True) - np.median(a, axis=1,keepdims=True)
a += diff