3

我有一个维度为 n * d * m 的 3 维数组。但是,ni 可以变化。它看起来像这样

[[[1,1,3],  [[3,2,1],  [[4,3,2],  
  [3,4,2]],  [3,4,2],   [5,2,3]]]
             [4,5,3]],

我需要计算所有数据点的平均值。我正在使用该scipy.stats.mean功能,但抛出了关于尺寸不匹配的错误。因此,我正在考虑将数组填充到最大的 ni 以便它具有像这样的统一尺寸

[[[  1,  1,  3],  [[3,2,1],  [[  4,  3,  2],  
  [  3,  4,  2],   [3,4,2],   [  5,  2,  3],
  [NaN,NaN,NaN]],  [4,5,3]],  [NaN,NaN,NaN]]] 

但我不知道这是否是最好的解决方案,也不知道如何用 NaN 计算平均值。

有什么建议么?

4

3 回答 3

2

您可以使用掩码数组

>>> from numpy import ma, nan
>>> a = ma.array([[1,1,3], [3,4,2], [nan,nan,nan]], mask=[[0,0,0],[0,0,0],[1,1,1]])
>>> b = ma.array([[3,2,1], [3,4,2], [4,5,3]])
>>> c = ma.array([[4,3,2], [5,2,3], [nan,nan,nan]], mask=[[0,0,0],[0,0,0],[1,1,1]])
>>> X = ma.array([a, b, c])

然后在任何轴上取平均值将忽略掩码值:

>>> X.mean(axis=0)
masked_array(data =
 [[2.66666666667 2.0 2.0]
 [3.66666666667 3.33333333333 2.33333333333]
 [4.0 5.0 3.0]],
             mask =
 [[False False False]
 [False False False]
 [False False False]],
       fill_value = 1e+20)

>>> X.mean(axis=1)
masked_array(data =
 [[2.0 2.5 2.5]
 [3.33333333333 3.66666666667 2.0]
 [4.5 2.5 2.5]],
             mask =
 [[False False False]
 [False False False]
 [False False False]],
       fill_value = 1e+20)

>>> X.mean(axis=2)
masked_array(data =
 [[1.66666666667 3.0 --]
 [2.0 3.0 4.0]
 [3.0 3.33333333333 --]],
             mask =
 [[False False  True]
 [False False False]
 [False False  True]],
       fill_value = 1e+20)
于 2013-02-20T12:37:34.973 回答
0

假设您的数组实际上[[[1,1,3],[3,4,2]],[[3,2,1],[3,4,2],[4,5,3]],[[4,3,2],[5,2,3]]]是您提到的应该是 3 维数组,那么可以使用循环找到平均值:

>>> l = [[[1,1,3],[3,4,2]],[[3,2,1],[3,4,2],[4,5,3]],[[4,3,2],[5,2,3]]]
>>> s = 0; n=0;

>>> for i in l:    #First loop traverses through the first dimension
        for j in i:    #Traverses through the second dimension
            s += sum(j)
            n += len(j)


>>> print("Average is ", s/n)
Average is  2.85714
于 2013-02-20T12:02:52.570 回答
0

看起来所有 numpy 数组函数都失败了,因为您的对象是 2D 数组列表而不是 3D numpy 数组。

一种解决方案是展开列表并分别计算均值。在您的情况下,这将是:

In [23]: import numpy as np

In [24]: L = np.array([[[1,1,3],[3,4,2]],
                  [[3,2,1],[3,4,2],[4,5,3]],[[4,3,2],[5,2,3]]])

In [28]: Lsum = ( np.sum(L[0]) + np.sum(L[1]) + np.sum(L[2]) ) 

In [29]: Lmean = Lsum.astype(float) \ 
                   / ( np.size(L[0]) + np.size(L[1]) + np.size(L[2]) )

In [46]: Lmean
Out[46]: 2.8571428571428572

这可以放入一个循环以改变第三维......

于 2013-02-20T12:53:11.177 回答