A = np.array([.....])
s = A.shape # (256, 256, 256)
B = A.copy() # be sure to save original data
# reshape last dimension into new dim and bin-size (int div for index & shape)
B = B.reshape(s[0], s[1], s[2] // 4, 4)
B = np.mean(B, axis=-1) # computes average along last dim
B.shape # (256, 256, 64)
... # repeat for other 2 dimensions.
import numpy as np
from scipy.signal import convolve
old_shape = 256
a = np.arange(old_shape**3).reshape(old_shape, old_shape, old_shape)
new_shape = 64 # should be an integer divider of old shape
ksize = old_shape // new_shape
kernel = np.ones((ksize, ksize, ksize)) / (ksize**3)
res = convolve(a, kernel, 'valid')[::ksize,::ksize,::ksize]
如果要将数据分类为更粗略的分辨率,请尝试分别沿每个维度使用
np.reshape
和np.mean
进行分类:这应该是合理的快速,因为您正在使用
numpys
内部向量化加:
我不是稀疏矩阵方面的专家,但是如果它真的是SPAR,那么研究一下scipy.sparse可能会有用
您可以使用
scipy.signal.convolve
计算移动平均值,并跳过中间元素:只在大小为(4,4,4)的非重叠子矩阵上寻找卷积。下面是您的操作方法(可能是最快、占用内存最少的,因为它共享内存,并且不会对任何不必要的子数组进行额外计算):
如果您不希望将输出放大到内核中的点总和,只需将
output
除以kernel.size
(即output/=kernel.size
)例如:
output.shape:
相关问题 更多 >
编程相关推荐