numpy数组方向均值没有降维

时间:2014-12-17 10:07:41

标签: python arrays numpy

我如何做以下事项:
使用3D numpy数组时,我想在一个维度中取平均值,并将值分配回具有相同形状的3D数组,并在方法的重复值中导出... 我很难在3D中找到一个例子,但在2D(4x4)中它看起来有点像我猜想

array[[1, 1, 2, 2]     
      [2, 2, 1, 0]  
      [1, 1, 2, 2]  
      [4, 8, 3, 0]] 

成为

array[[2, 3, 2, 1]     
      [2, 3, 2, 1]  
      [2, 3, 2, 1]  
      [2, 3, 2, 1]]   

我在考虑平均值时遇到np.mean和尺寸损失。

4 个答案:

答案 0 :(得分:3)

您可以使用keepdims关键字参数来保持消失的维度,例如:

>>> a = np.random.randint(10, size=(4, 4)).astype(np.double)
>>> a
array([[ 7.,  9.,  9.,  7.],
       [ 7.,  1.,  3.,  4.],
       [ 9.,  5.,  9.,  0.],
       [ 6.,  9.,  1.,  5.]])
>>> a[:] = np.mean(a, axis=0, keepdims=True)
>>> a
array([[ 7.25,  6.  ,  5.5 ,  4.  ],
       [ 7.25,  6.  ,  5.5 ,  4.  ],
       [ 7.25,  6.  ,  5.5 ,  4.  ],
       [ 7.25,  6.  ,  5.5 ,  4.  ]])

答案 1 :(得分:1)

你可以在取平均值后重新调整数组:

In [24]: a = np.array([[1, 1, 2, 2],
[2, 2, 1, 0],
[2, 3, 2, 1],
[4, 8, 3, 0]])
In [25]: np.resize(a.mean(axis=0).astype(int), a.shape)
Out[25]: 
array([[2, 3, 2, 0],
       [2, 3, 2, 0],
       [2, 3, 2, 0],
       [2, 3, 2, 0]])

答案 2 :(得分:1)

为了正确地满足平均值的重复值出现在它们的导出方向上的条件,有必要将reshape平均数组转换为可与原始数组一起播放的形状。

具体来说,平均数组应该与原始数组具有相同的形状,除了平均值的维度长度应为1。

以下函数适用于任何形状的数组和任意数量的维度:

def fill_mean(arr, axis):
    mean_arr = np.mean(arr, axis=axis)
    mean_shape = list(arr.shape)
    mean_shape[axis] = 1
    mean_arr = mean_arr.reshape(mean_shape)   
    return np.zeros_like(arr) + mean_arr

这是应用于我称为a的示例数组的函数:

>>> fill_mean(a, 0)
array([[ 2.25,  3.5 ,  2.  ,  0.75],
       [ 2.25,  3.5 ,  2.  ,  0.75],
       [ 2.25,  3.5 ,  2.  ,  0.75],
       [ 2.25,  3.5 ,  2.  ,  0.75]])

>>> fill_mean(a, 1)
array([[ 1.5 ,  1.5 ,  1.5 ,  1.5 ],
       [ 1.25,  1.25,  1.25,  1.25],
       [ 2.  ,  2.  ,  2.  ,  2.  ],
       [ 3.75,  3.75,  3.75,  3.75]])

答案 3 :(得分:0)

构造numpy数组

import numpy as np
data = np.array(
    [[1, 1, 2, 2],
     [2, 2, 1, 0],
     [1, 1, 2, 2],
     [4, 8, 3, 0]]
)

使用axis参数获取沿特定轴的平均值

>>> means = np.mean(data, axis=0)
>>> means
array([ 2.,  3.,  2.,  1.])

现在将生成的数组平铺为原始

的形状
>>> print np.tile(means, (4,1))
[[ 2.  3.  2.  1.]
 [ 2.  3.  2.  1.]
 [ 2.  3.  2.  1.]
 [ 2.  3.  2.  1.]]

您可以使用data.shape

中的参数替换4,1