平均NumPy数组但保留形状

9

我有一个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数组吗?

谢谢。


5
我非常喜欢你在问题中所期望看到的内容。 - lukecampbell
在我能想象的大多数情况下,广播将会在不需要三维数组的情况下完成。 - tillsten
5个回答

6

好的,注意,我还没有掌握numpy学位,但是在玩耍中,我想出了以下内容:

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

我喜欢这个,比起我想的要好。 - lukecampbell
只要您沿着最后一个轴取平均值,这一行代码适用于所有数组形状和大小。 - user545424

4

你是否考虑使用广播?如果你对该概念还不熟悉,可以在这里找到更多关于广播的信息。

下面是使用的示例,需要注意的是,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)

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

又一个很棒的答案。我该怎么选择?!谢谢! :) - AJP

0
这是针对任意轴的: < p > array 是多维数组,axis 是要平均的轴

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接