Numpy:“锯齿状”3D阵列中的一维平均值

时间:2013-12-13 17:19:43

标签: python arrays numpy jagged-arrays multidimensional-array

假设我有一个N * M * X维数组“数据”,其中N和M是固定的,但X对于每个条目数据[n] [m]是可变的。

(编辑:为了澄清,我只是在我用于读取数据的3D python列表中使用了np.array(),因此numpy数组的维度为N * M,其条目为可变长度列表)

我现在想要计算X维度的平均值,以便我留下一个N * M维数组。使用带有axis-argument的np.average / mean不起作用,所以我现在正在做的方式就是迭代N和M并将手动计算的平均值附加到新列表,但这不是感觉非常“蟒蛇”:

avgData=[]
for n in data:
    temp=[]
    for m in n:
        temp.append(np.average(m))
    avgData.append(temp)

我错过了一些明显的东西吗?我正在努力梳理我的蟒蛇技能,所以有趣/多样化的反应非常受欢迎! :)

谢谢!

2 个答案:

答案 0 :(得分:3)

如何使用np.vectorize

do_avg = np.vectorize(np.average)
data_2d = do_avg(data)

答案 1 :(得分:1)

data = np.array([[1,2,3],[0,3,2,4],[0,2],[1]]).reshape(2,2)
avg=np.zeros(data.shape)
avg.flat=[np.average(x) for x in data.flat]
print avg
#array([[ 2.  ,  2.25],
#       [ 1.  ,  1.  ]])

这仍然会迭代数据元素(没有任何非Pythonic)。但由于shape的{​​{1}}或axes没有什么特别之处,我只是使用data。在使用data.flat附加到Python list时,最好将值分配给现有数组的元素。

有快速数值方法可以处理numpy数组,但大多数(如果不是全部)使用简单的数字numpy。这里的数组元素是dtypes(列表或数组),numpy必须求助于通常的Python迭代和列表操作。

对于这个小例子,这个解决方案比Zwicker的object快一点。对于较大的vectorize,两种解决方案大约需要相同的时间。