2012-05-09 120 views
8

我有一个Numpy 3轴阵列,其元素是三维的。我想平均他们并返回相同的阵列形状。正常的平均函数删除的3个维度,并与平均更换(如预期):平均numpy数组,但保留形状

a = np.array([[[0.1, 0.2, 0.3], [0.2, 0.3, 0.4]], 
       [[0.4, 0.4, 0.4], [0.7, 0.6, 0.8]]], np.float32) 

b = np.average(a, axis=2) 
# b = [[0.2, 0.3], 
#  [0.4, 0.7]] 

结果所需

# b = [[[0.2, 0.2, 0.2], [0.3, 0.3, 0.3]], 
#  [[0.4, 0.4, 0.4], [0.7, 0.7, 0.7]]] 

你能做到这一点优雅或者我只需要遍历在Python中的数组(这将比强大的Numpy函数慢很多)。

您可以将np.mean函数的Dtype参数设置为1D数组吗?

谢谢。

+2

的你想在这个问题,看看有什么大风扇。 – lukecampbell

+0

在大多数情况下,我可以想象,广播将不需要3D数组。 – tillsten

回答

3
>>> import numpy as np 
>>> a = np.array([[[0.1, 0.2, 0.3], [0.2, 0.3, 0.4]], 
...    [[0.4, 0.4, 0.4], [0.7, 0.6, 0.8]]], np.float32) 
>>> b = np.average(a, axis=2) 
>>> b 
array([[ 0.2  , 0.29999998], 
     [ 0.40000001, 0.69999999]], dtype=float32) 
>>> c = np.dstack((b, b, b)) 
>>> c 
array([[[ 0.2  , 0.2  , 0.2  ], 
     [ 0.29999998, 0.29999998, 0.29999998]], 

     [[ 0.40000001, 0.40000001, 0.40000001], 
     [ 0.69999999, 0.69999999, 0.69999999]]], dtype=float32) 
+0

为什么这会得到downvoted? – AJP

6

好吧,注意我没有我在numpyology的主人还没有,但只是在玩的时候,我想出了:

>>> np.average(a,axis=-1).repeat(a.shape[-1]).reshape(a.shape) 
array([[[ 0.2  , 0.2  , 0.2  ], 
     [ 0.29999998, 0.29999998, 0.29999998]], 

     [[ 0.40000001, 0.40000001, 0.40000001], 
     [ 0.69999999, 0.69999999, 0.69999999]]], dtype=float32) 
+0

我喜欢它,这比我想出的要好。 – lukecampbell

+0

这个效果很好....比龙虾或Bago的答案有什么优势? – AJP

+0

这是一条线,只要沿着最后一个轴取平均值,它就适用于所有阵列形状和大小。 – user545424

5

你有没有考虑过用广播? Here是关于广播的更多信息,如果你对这个概念不熟悉的话。

下面是使用broadcast_arrays一个例子,请记住,通过broadcast_arrays这里生产的b只读应及时治疗,你应该做一个副本,如果你想要写它:

>>> b = np.average(a, axis=2)[:, :, np.newaxis] 
>>> b, _ = np.broadcast_arrays(b, a) 
>>> b 
array([[[ 0.2  , 0.2  , 0.2  ], 
     [ 0.29999998, 0.29999998, 0.29999998]], 

     [[ 0.40000001, 0.40000001, 0.40000001], 
     [ 0.69999999, 0.69999999, 0.69999999]]], dtype=float32) 
+0

这是一个辉煌的链接,谢谢。 – AJP

+0

也是一个很好的答案。 – AJP

1

这里避免复印的方法:

a = a.T 
a[:] = a.mean(axis=0) 
a = a.T 

或者,如果你不想覆盖a

b = np.empty_like(a) 
b = b.T 
b[:] = a.mean(axis=-1).T 
b = b.T 
+0

另一个很好的答案。我该如何选择?谢谢! :) – AJP

0

这是一个任意轴:

array是ndimentional阵列 和axis是轴平均

np.repeat(np.expand_dims(np.mean(array, axis), axis), array.shape[axis], axis) 
相关问题