Python Numpy:一个维度上的平均值,单位为“;“锯齿状”;三维阵列

Python Numpy:一个维度上的平均值,单位为“;“锯齿状”;三维阵列,python,arrays,numpy,jagged-arrays,multidimensional-array,Python,Arrays,Numpy,Jagged Arrays,Multidimensional Array,假设我有一个N*M*X维数组“data”,其中N和M是固定的,但X是每个条目数据[N][M]的变量 (编辑:为了澄清,我刚刚在3D python列表上使用了np.array(),我用于读取数据,因此numpy数组的维数为N*M,其条目为可变长度列表) 现在我想计算X维上的平均值,这样我剩下一个N*m维数组。在axis参数中使用np.average/mean不起作用,因此我现在的做法是迭代N和m,并将手动计算的平均值附加到一个新列表中,但这感觉不是很“python”: 我是不是漏掉了什么明显的东西

假设我有一个N*M*X维数组“data”,其中N和M是固定的,但X是每个条目数据[N][M]的变量

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

现在我想计算X维上的平均值,这样我剩下一个N*m维数组。在axis参数中使用np.average/mean不起作用,因此我现在的做法是迭代N和m,并将手动计算的平均值附加到一个新列表中,但这感觉不是很“python”:

我是不是漏掉了什么明显的东西?我正在尝试更新我的python技能,所以非常欢迎有趣/多样的响应!)

谢谢

如何使用:

这仍然会在数据元素上进行迭代(这没有什么不符合Pythonic的)。但是由于
数据的
形状
没有什么特别之处,所以我只使用
data.flat
。当附加到Python
list
时,使用
numpy
最好为现有数组的元素赋值

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


对于这个小示例,此解决方案比Zwicker的
矢量化
快一点。对于较大的
数据
两种解决方案的时间大致相同。

数据是如何存储的?numpy不提供任何方法来处理锯齿数组(
X
对于numpy来说始终是一个常量),因此您必须用某种东西填充这些值,或者使用屏蔽数组,或者…@mgilson编辑了这个问题。我刚刚有一个3D python列表,并在上面调用了np.array()。所以我猜这是一个列表对象的2D数组?如果你不知道数据是如何排列的,我们应该怎么做?您可以使用数组的
.shape
.dtype
属性来检查这一点。很有趣!我考虑过使用重塑,但不太知道如何使用。我并不是说迭代元素不是非Python的,只是有一个解决方案比使用for循环读起来更干净。一个或另一个将会有一个循环,不管它是在编译函数中,隐藏在Python函数中,还是显式的。如果第三维度不是锯齿状的,它将是一个真正的3d数组,你可以简单地在第三维度上求平均值。我应该深入研究
vectorize
,看看它是如何隐藏循环的。
avgData=[]
for n in data:
    temp=[]
    for m in n:
        temp.append(np.average(m))
    avgData.append(temp)
do_avg = np.vectorize(np.average)
data_2d = do_avg(data)
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.  ]])