平均 numpy 数组但保持形状

问题描述 投票:0回答:6

我有一个 Numpy 3 轴数组,其元素是 3 维的。我想对它们进行平均并返回相同形状的数组。普通平均函数删除 3 个维度并将其替换为平均值(如预期):

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 参数设置为一维数组吗?

谢谢。

python multidimensional-array numpy shapes average
6个回答
6
投票

好吧,注意我还没有数学学硕士学位,但只是玩玩,我想出了:

>>> 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)

4
投票

您考虑过使用广播吗?如果您对广播概念不熟悉,这里提供了有关广播的更多信息。

这里是一个使用

broadcast_arrays
的示例,请记住,由
b
生成的
broadcast_arrays
应该被视为只读,如果你想写入它,你应该制作一个副本:

>>> 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)

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)

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
投票

这适用于任意轴:

array
是维数组
axis
是平均轴

np.repeat( np.expand_dims( np.mean( array, axis ), axis ), array.shape[axis], axis )

0
投票

您现在可以在

keepdims=True
 中使用 
numpy.mean
来保留原始形状:

keepdims布尔,可选

如果设置为 True,则缩小的轴将作为尺寸为 1 的维度保留在结果中。使用此选项,结果将针对输入数组正确广播。

如果传递默认值,那么keepdims将不会传递给ndarray子类的mean方法,但任何非默认值都会传递。如果子类的方法没有实现 keepdims,则会引发任何异常。

例如:

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)
z = np.mean(a, axis=2, keepdims=True)
print('a.shape: %s\nz.shape: %s' %(a.shape, z.shape))

输出:

a.shape: (2, 2, 3)
z.shape: (2, 2, 1)
© www.soinside.com 2019 - 2024. All rights reserved.