我有一大堆图像,我需要从每张图像中减去背景。初始堆栈是五维的,要减去的图像是二维的。减法使用嵌套循环效果很好,但当我切换到 [:,:]
表示法时效果不佳。您对如何解决这个问题有什么建议吗?
换句话说,这是可行的
for aa in range(B.shape[0]):
for bb in range(B.shape[1]):
A_clean[i,j,k,aa,bb] = A[i,j,k,aa,bb] - B[aa,bb]
而这个,我更愿意使用,因为它更快,但不是
A_clean[i,j,k,:,:] = A[i,j,k,:,:] - B[:,:]
A
、A_clean
和 B
都是 numpy 数组。
最佳答案
有两种方法可以根据您的需要...
- 整形为
b = b.reshape((1,1,1,)+b.shape)
- 你可以像
b[np.newaxis, np.newaxis, np.newaxis, :, :]
这样索引
下面是一个例子和测试
import numpy as np
a = np.random.random((4,4,4,4,4))
b = np.zeros((4,4)) - 9999
b_adj = b.reshape((1,1,1,4,4)) # the reshape
res_validation = a.copy()
for aa in range(b.shape[0]):
for bb in range(b.shape[1]):
res[:,:,:,aa,bb] = a[:,:,:,aa,bb] - b[aa,bb]
检查结果
res = a - b_adj
(res == res_validation ).all()
引用资料
关于python - 快速有效地减去数组的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45609873/