平均numpy数组,但保持形状

oyjwcjzk  于 2024-01-08  发布在  其他
关注(0)|答案(6)|浏览(137)

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

  1. a = np.array([[[0.1, 0.2, 0.3], [0.2, 0.3, 0.4]],
  2. [[0.4, 0.4, 0.4], [0.7, 0.6, 0.8]]], np.float32)
  3. b = np.average(a, axis=2)
  4. # b = [[0.2, 0.3],
  5. # [0.4, 0.7]]

字符串

结果必填

  1. # b = [[[0.2, 0.2, 0.2], [0.3, 0.3, 0.3]],
  2. # [[0.4, 0.4, 0.4], [0.7, 0.7, 0.7]]]


你能优雅地完成这个操作吗,还是我必须在Python中迭代数组(与功能强大的Numpy函数相比,这要慢得多)。
你能把np.mean函数的Dtype参数设为一个1D数组吗?
谢谢.

nhn9ugyo

nhn9ugyo1#

好吧,警告我还没有掌握钱币学,但只是玩玩,我想出了:

  1. >>> np.average(a,axis=-1).repeat(a.shape[-1]).reshape(a.shape)
  2. array([[[ 0.2 , 0.2 , 0.2 ],
  3. [ 0.29999998, 0.29999998, 0.29999998]],
  4. [[ 0.40000001, 0.40000001, 0.40000001],
  5. [ 0.69999999, 0.69999999, 0.69999999]]], dtype=float32)

字符串

hc8w905p

hc8w905p2#

你考虑过使用广播吗?Here是关于广播的更多信息,如果你是新的概念。
下面是一个使用broadcast_arrays的例子,请记住,broadcast_arrays在这里产生的b应该被视为只读,如果你想写它,你应该做一个副本:

  1. >>> b = np.average(a, axis=2)[:, :, np.newaxis]
  2. >>> b, _ = np.broadcast_arrays(b, a)
  3. >>> b
  4. array([[[ 0.2 , 0.2 , 0.2 ],
  5. [ 0.29999998, 0.29999998, 0.29999998]],
  6. [[ 0.40000001, 0.40000001, 0.40000001],
  7. [ 0.69999999, 0.69999999, 0.69999999]]], dtype=float32)

字符串

nwo49xxi

nwo49xxi3#

  1. >>> import numpy as np
  2. >>> a = np.array([[[0.1, 0.2, 0.3], [0.2, 0.3, 0.4]],
  3. ... [[0.4, 0.4, 0.4], [0.7, 0.6, 0.8]]], np.float32)
  4. >>> b = np.average(a, axis=2)
  5. >>> b
  6. array([[ 0.2 , 0.29999998],
  7. [ 0.40000001, 0.69999999]], dtype=float32)
  8. >>> c = np.dstack((b, b, b))
  9. >>> c
  10. array([[[ 0.2 , 0.2 , 0.2 ],
  11. [ 0.29999998, 0.29999998, 0.29999998]],
  12. [[ 0.40000001, 0.40000001, 0.40000001],
  13. [ 0.69999999, 0.69999999, 0.69999999]]], dtype=float32)

字符串

6kkfgxo0

6kkfgxo04#

下面是一个避免复制的方法:

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

字符串
或者如果你不想覆盖a

  1. b = np.empty_like(a)
  2. b = b.T
  3. b[:] = a.mean(axis=-1).T
  4. b = b.T

6kkfgxo0

6kkfgxo05#

这是一个任意轴:
array是n维数组,axis是平均轴

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

字符串

i2byvkas

i2byvkas6#

您可以在numpy.mean中使用keepdims=True来保留原始尺寸:

keepdims:*bool,可选 *

如果此设置为True,则减小的轴将作为尺寸为1的维留在结果中。使用此选项,结果将根据输入数组正确广播。
如果传递了默认值,那么keepdims将不会传递给ndarray的子类的mean方法,但是任何非默认值都会传递。如果子类的方法没有实现keepdims,则会引发任何异常。
这已经解决了许多广播情况。但是,如果你需要相同的形状,你可以使用np.broadcast_to

  1. import numpy as np
  2. a = np.array([[[0.1, 0.2, 0.3], [0.2, 0.3, 0.4]],
  3. [[0.4, 0.4, 0.4], [0.7, 0.6, 0.8]]], np.float32)
  4. m1 = np.mean(a, axis=2, keepdims=True)
  5. m2 = np.broadcast_to(m1, a.shape)
  6. print('a.shape: %s\nm1.shape: %s\nm2.shape: %s' %(a.shape, m1.shape, m2.shape))

字符串
输出量:

  1. a.shape: (2, 2, 3)
  2. m1.shape: (2, 2, 1)
  3. m2.shape: (2, 2, 3)

展开查看全部

相关问题