Python:快速查找主要填充为零的大型 4 维数组的平均值的方法
Python: Fast way of finding the mean of large 4D-arrays filled with mostly zeros
我有很多大型 4D 阵列,我想取其平均值。这些数组大多用零填充 (>99%),但每个数组在不同位置都有非零值。每个数组还有一个相应的数组,对其进行加权以取平均值。
以直接的方式(如下)取数组的平均值需要很长时间来计算,并且经常导致我的内存错误。
>>> a, b, weights_a, weights_b = [np.zeros((150,150,150,150)) for i in range(4)]
>>> valInds_a = np.random.randint(0,a.size,7000)
>>> valInds_b = np.random.randint(0,b.size,7000)
>>> a.ravel()[valInds_a] = np.random.random(7000)
>>> weights_a.ravel()[valInds_a] = np.random.random(7000)
>>> b.ravel()[valInds_b] = np.random.random(7000)
>>> weights_b.ravel()[valInds_b] = np.random.random(7000)
>>> avg = np.average([a,b],0, weights = [weights_a,weights_b])
我正在寻找一种更快的方法来计算这个平均值。我认为可能有一种方法,因为大多数值都是零。我研究过使用稀疏数组,但它们不支持超过 2 维的数组。
一种方法是只取 a
或 b
非零的平均值,因为我们知道否则平均值将为零。
如果您有权访问 valInds_a
和 valInds_b
,则可以这样做:
valInds_both = np.union1d(valInds_a, valInds_b)
avg = np.zeros_like(a)
avg.ravel()[valInds_both] = np.average(
[a.ravel()[valInds_both], b.ravel()[valInds_both]],
axis=0,
weights=[weights_a.ravel()[valInds_both], weights_b.ravel()[valInds_both]])
我有很多大型 4D 阵列,我想取其平均值。这些数组大多用零填充 (>99%),但每个数组在不同位置都有非零值。每个数组还有一个相应的数组,对其进行加权以取平均值。
以直接的方式(如下)取数组的平均值需要很长时间来计算,并且经常导致我的内存错误。
>>> a, b, weights_a, weights_b = [np.zeros((150,150,150,150)) for i in range(4)]
>>> valInds_a = np.random.randint(0,a.size,7000)
>>> valInds_b = np.random.randint(0,b.size,7000)
>>> a.ravel()[valInds_a] = np.random.random(7000)
>>> weights_a.ravel()[valInds_a] = np.random.random(7000)
>>> b.ravel()[valInds_b] = np.random.random(7000)
>>> weights_b.ravel()[valInds_b] = np.random.random(7000)
>>> avg = np.average([a,b],0, weights = [weights_a,weights_b])
我正在寻找一种更快的方法来计算这个平均值。我认为可能有一种方法,因为大多数值都是零。我研究过使用稀疏数组,但它们不支持超过 2 维的数组。
一种方法是只取 a
或 b
非零的平均值,因为我们知道否则平均值将为零。
如果您有权访问 valInds_a
和 valInds_b
,则可以这样做:
valInds_both = np.union1d(valInds_a, valInds_b)
avg = np.zeros_like(a)
avg.ravel()[valInds_both] = np.average(
[a.ravel()[valInds_both], b.ravel()[valInds_both]],
axis=0,
weights=[weights_a.ravel()[valInds_both], weights_b.ravel()[valInds_both]])