Python:快速找到大多数零填充的大型4D阵列的平均值

时间:2017-07-25 22:10:10

标签: 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.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个以上维度的数组。

1 个答案:

答案 0 :(得分:2)

执行此操作的一种方法是仅取bvalInds_a中的任何一个非零的平均值,因为我们知道平均值将为零。

如果您可以访问valInds_bvalInds_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]]) ,则可以这样做:

@supports not (mix-blend-mode: multiply) {
  .image {
    ...
  }
}