【发布时间】:2020-03-21 23:32:24
【问题描述】:
给定一个类型为“uint8”的大型 3d numpy 数组(不会太大而无法放入内存),我想在每个维度中使用给定的比例因子来缩小该数组。你可以假设数组的形状可以被比例因子整除。
数组的值在 [0, 1, ... max] 中,其中 max 始终小于 6。我想将其按比例缩小,以便每个形状为“scale_factor”的 3d 块返回的数字在这个区块中出现最多。当相等时返回第一个(我不在乎)。
我尝试了以下方法
import numpy as np
array = np.random.randint(0, 4, ((128, 128, 128)), dtype='uint8')
scale_factor = (4, 4, 4)
bincount = 3
# Reshape to free dimension of size scale_factor to apply scaledown method to
m, n, r = np.array(array.shape) // scale_factor
array = array.reshape((m, scale_factor[0], n, scale_factor[1], r, scale_factor[2]))
# Making histogram, first over last axis, then sum over other two
array = np.apply_along_axis(lambda x: np.bincount(x, minlength=bincount),
axis=5, arr=array)
array = np.apply_along_axis(lambda x: np.sum(x), axis=3, arr=array)
array = np.apply_along_axis(lambda x: np.sum(x), axis=1, arr=array).astype('uint8')
array = np.argmax(array , axis=3)
这行得通,但是 bincount 非常慢。也让 np.histogram 工作,但也很慢。我确实认为我尝试过的两种方法都不是完全为我的目的而设计的,它们提供了更多的特性,这些特性会减慢这些方法的速度。
我的问题是,有人知道更快的方法吗?如果有人可以向我指出深度学习库中的一种方法,我也会很高兴,但这不是正式的问题。
【问题讨论】:
-
apply_along_axis 在我的理解中是一个花哨的 python for 循环。
-
我的意思是让你慢下来的不是 bincount
标签: python numpy numpy-ndarray downsampling