keepdims 在 Numpy (Python) 中的作用是什么?

新手上路,请多包涵

当我使用 np.sum 时,我遇到了一个名为 keepdims 的参数。查阅 文档 后,我仍然无法理解 keepdims 的含义。

keepdims :bool,可选

如果将其设置为 True,则减少的轴将作为大小为 1 的维度保留在结果中。使用此选项,结果将根据原始 arr 正确广播。

如果有人能通过一个简单的例子对此有所了解,我将不胜感激。

原文由 watermelon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 760
1 个回答

考虑一个小的二维数组:

 In [180]: A=np.arange(12).reshape(3,4)
In [181]: A
Out[181]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

跨行求和;结果是一个 (3,) 数组

In [182]: A.sum(axis=1)
Out[182]: array([ 6, 22, 38])

但是要将 A 加起来(或除以 sum 需要重塑

In [183]: A-A.sum(axis=1)
...
ValueError: operands could not be broadcast together with shapes (3,4) (3,)
In [184]: A-A.sum(axis=1)[:,None]   # turn sum into (3,1)
Out[184]:
array([[ -6,  -5,  -4,  -3],
       [-18, -17, -16, -15],
       [-30, -29, -28, -27]])

如果我使用 keepdims ,“结果将针对” A 正确广播。

 In [185]: A.sum(axis=1, keepdims=True)   # (3,1) array
Out[185]:
array([[ 6],
       [22],
       [38]])
In [186]: A-A.sum(axis=1, keepdims=True)
Out[186]:
array([[ -6,  -5,  -4,  -3],
       [-18, -17, -16, -15],
       [-30, -29, -28, -27]])

如果我用另一种方式总结,我不需要 keepdims 。广播这个总和是自动的: A.sum(axis=0)[None,:] 。但是使用 keepdims 没有坏处。

 In [190]: A.sum(axis=0)
Out[190]: array([12, 15, 18, 21])    # (4,)
In [191]: A-A.sum(axis=0)
Out[191]:
array([[-12, -14, -16, -18],
       [ -8, -10, -12, -14],
       [ -4,  -6,  -8, -10]])

如果您愿意,这些操作可能更适合 np.mean ,在列或行上规范化数组。在任何情况下,它都可以简化原始数组和总和/平均值之间的进一步数学运算。

原文由 hpaulj 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题