9

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

谢谢。

4

5 回答 5

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)
于 2012-05-09T18:30:31.060 回答
4

您是否考虑过使用广播?如果您不熟悉这个概念,这里有更多关于广播的信息。

这是一个使用 的示例broadcast_arrays,请记住,b此处生成的 bybroadcast_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)
于 2012-05-09T21:34:23.230 回答
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)
于 2012-05-09T18:40:30.687 回答
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
于 2012-05-09T23:25:50.697 回答
0

这是针对任意轴:

array是维度数组,axis是平均轴

np.repeat( np.expand_dims( np.mean( array, axis ), axis ), array.shape[axis], axis )
于 2013-10-08T15:28:28.430 回答