繁体   English   中英

如何将n维数组除以维度中的第一个值

[英]How to divide an n-dimensional array by the first value from a dimension

给定一个维度为 N 的数组,如何将数组中的所有值除以所选维度的第一个值?

示例代码:

import numpy as np
A = np.random.randint(1, 10, size=(3,3,3))
B = A[:,:,0]
C = np.divide(A,B)
A
print()
B
print()
C
print()
C[:,:,0]

Output:

array([[[1, 8, 5],
        [3, 6, 5],
        [5, 4, 2]],

       [[6, 2, 9],
        [4, 2, 2],
        [5, 6, 8]],

       [[3, 3, 1],
        [2, 7, 7],
        [6, 4, 6]]])


array([[1, 3, 5],
       [6, 4, 5],
       [3, 2, 6]])


array([[[1.        , 2.66666667, 1.        ],
        [0.5       , 1.5       , 1.        ],
        [1.66666667, 2.        , 0.33333333]],

       [[6.        , 0.66666667, 1.8       ],
        [0.66666667, 0.5       , 0.4       ],
        [1.66666667, 3.        , 1.33333333]],

       [[3.        , 1.        , 0.2       ],
        [0.33333333, 1.75      , 1.4       ],
        [2.        , 2.        , 1.        ]]])


array([[1.        , 0.5       , 1.66666667],
       [6.        , 0.66666667, 1.66666667],
       [3.        , 0.33333333, 2.        ]])

我期待来自 C[:,:,0] 的最终 output 全部为 1。 我想这与 B 的广播有关,但我想我不明白为什么它不将 B 广播成沿维度 2 复制的形状 (3,3,3)。

要获得预期的结果,您可以将B数组重塑为:

B = A[:,:,0].reshape(3,-1, 1)

然后,当你划分时,你会得到如下结果:

array([[[1.        , 0.11111111, 0.11111111],
        [1.        , 0.25      , 0.5       ],
        [1.        , 0.88888889, 0.44444444]],

       [[1.        , 0.88888889, 1.        ],
        [1.        , 1.8       , 1.6       ],
        [1.        , 4.5       , 0.5       ]],

       [[1.        , 0.66666667, 0.5       ],
        [1.        , 1.125     , 0.75      ],
        [1.        , 0.5       , 2.25      ]]])

您还可以通过将B设为:

B = A[:,:,0:1]

您需要重塑B使其与A[:,:,0]对齐:

>>> A
array([[[1, 8, 5],
        [3, 6, 5],
        [5, 4, 2]],

       [[6, 2, 9],
        [4, 2, 2],
        [5, 6, 8]],

       [[3, 3, 1],
        [2, 7, 7],
        [6, 4, 6]]])

>>> B = A[:, :, 0]
>>> B
array([[1, 3, 5],
       [6, 4, 5],
       [3, 2, 6]])

# And you need to reorient B as:

>>> B.T[None,:].T
array([[[1],
        [3],
        [5]],

       [[6],
        [4],
        [5]],

       [[3],
        [2],
        [6]]])

>>> A / B.T[None,:].T
array([[[1.        , 8.        , 5.        ],
        [1.        , 2.        , 1.66666667],
        [1.        , 0.8       , 0.4       ]],

       [[1.        , 0.33333333, 1.5       ],
        [1.        , 0.5       , 0.5       ],
        [1.        , 1.2       , 1.6       ]],

       [[1.        , 1.        , 0.33333333],
        [1.        , 3.5       , 3.5       ],
        [1.        , 0.66666667, 1.        ]]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM