python 嵌套数组的NumPy求和轴

x6h2sr28  于 2023-03-07  发布在  Python
关注(0)|答案(4)|浏览(165)

当我用NumPy对嵌套数组求和时,我没有得到我所期望的结果。

>>> import numpy as np
>>> vals = np.array([[[38., 27.], [20., 12.]], [[10., 27.], [10., 30.]], [[13., 16.], [5., 5.]]])
>>> vals.sum(axis=1)
array([[58., 39.],
       [20., 57.],
       [18., 21.]])

我本以为“axis=1”会一直执行下去,结果如下:

array([65., 32.],
      [37., 40.],
      [40,, 29.])

但可能我只是没有正确地思考轴!无论如何,我认为我想要的结果是连贯的,所以任何帮助你可以给予实现它将不胜感激。

nuypyhwy

nuypyhwy1#

我会提出一个稍微复杂一点的解决方案,这可能会帮助您了解如何使用轴。这里我使用来自numpy的transpose方法转置您的原始数组,然后我获得您预期结果的转置,所以我再次使用transpose。代码如下:

np.transpose(vals).sum(axis=0).transpose()

如预期,输出为:

array([[65., 32.],
       [37., 40.],
       [29., 10.]])
ubbxdtey

ubbxdtey2#

我认为您的意思是使用axis=2

而你期望的最后一行是个打字错误

array([[65., 32.],
       [37., 40.],
       [29., 10.]])

记住轴从0开始,并从外到内工作

如果沿着axis = 2求和,则是对 * innerest * 组数据求和,这将产生所需结果。您可以这样想:

np.array([  [ 38 + 27, 20 + 12], 
            [ 10 + 27, 10 + 30], 
            [ 13 + 16,  5 +  5]
         ])
fcy6dtqo

fcy6dtqo3#

axis参数指定要在哪个轴上执行求和运算。请尝试以下操作:

import numpy as np

vals = np.array([[[38., 27.], [20., 12.]], [[10., 27.], [10., 30.]], [[13., 16.], [5., 5.]]])
result = vals.sum(axis=(1,2))
print(result)
avwztpqn

avwztpqn4#

“求和所沿着的一个或多个轴”可能会引起混淆,尤其是当两个或更多维度相同,或者数组是二维的时候。
对于1d来说,它只能有一个意义,对于所有维度都不同的3d来说,动作变得更加清晰,一个轴被“移除”,另外2个轴保留。

In [179]: x=np.ones((2,3,4),int)

In [180]: x.sum(axis=0)
Out[180]: 
array([[2, 2, 2, 2],    # (3,4) shape
       [2, 2, 2, 2],
       [2, 2, 2, 2]])

In [181]: x.sum(axis=1)
Out[181]: 
array([[3, 3, 3, 3],     # (2,4) shape, 3 values are summed
       [3, 3, 3, 3]])

In [182]: x.sum(axis=2)   
Out[182]: 
array([[4, 4, 4],       # (2,3)
       [4, 4, 4]])

或将求和后的维度保留为:

In [183]: x.sum(axis=2, keepdims=True)
Out[183]: 
array([[[4],          # (2,3,1)
        [4],
        [4]],

       [[4],
        [4],
        [4]]])

用一组斧头

In [185]: x.sum(axis=(0,2), keepdims=True)
Out[185]: 
array([[[8],
        [8],
        [8]]])

In [186]: _.shape
Out[186]: (1, 3, 1)

相关问题