Python:一种快速查找大型4D数组平均值的方法,其中大部分数组都是零

Python:一种快速查找大型4D数组平均值的方法,其中大部分数组都是零,python,large-data,Python,Large Data,我有许多大型4D阵列,我想取平均值。这些数组大多用零(>99%)填充,但每个数组在不同的位置都有非零值。每个数组还具有相应的数组,该数组对其进行加权以获取平均值 以一种简单的方式计算数组的平均值(如下所示)需要很长的计算时间,并且经常会导致我的内存错误 >>> a, b, weights_a, weights_b = [np.zeros((150,150,150,150)) for i in range(4)] >>> valInds_a = np.rand

我有许多大型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]])

您可能想看看稀疏矩阵。在运行代码时,我得到了“ZeroDivisionError:权重和为零,无法规范化”。我最终使用了类似的方法,效果很好。