假设我有一个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)
我错过了一些明显的东西吗?我正在努力梳理我的蟒蛇技能,所以有趣/多样化的反应非常受欢迎! :)
谢谢!
答案 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
,两种解决方案大约需要相同的时间。