Skip to main content
 首页 » 编程设计

python之规范化 numpy 中的列

2025年05月04日15sky-heaven

问题:

如果我有一个 2D numpy 数组如下:

[[1., 0., 1.] 
 [1., 0., 2.] 
 [2., 0., 1.]] 

我想将所有列归一化为 1,结果是:

[[0.25, 0.33, 0.25] 
 [0.25, 0.33, 0.50] 
 [0.50, 0.33, 0.25]] 

请注意,在列的总和为 0 的情况下,我希望它们像您在上面看到的那样均匀分布。它本质上只是缩放,但有一种特殊情况。

现有尝试

如果我保证所有列加起来都是 > 0 那么我可以这样做:

>>> x = np.array([[1,2,3],[4,5,6],[7,8,9]]) * 1.0 
 
>>> x 
array([[ 1.,  2.,  3.], 
       [ 4.,  5.,  6.], 
       [ 7.,  8.,  9.]]) 
 
>>> x / np.sum(x, axis=0) 
array([[ 0.08333333,  0.13333333,  0.16666667], 
       [ 0.33333333,  0.33333333,  0.33333333], 
       [ 0.58333333,  0.53333333,  0.5       ]]) 

但是第一个例子失败了,因为你得到了一个 /0 错误。

理想的解决方案

如果有一个通用的解决方案也可以扩展到三维空间,那将是理想的。上面运行的示例对于 3D 数组的工作方式完全相同,但在零情况下仍然失败。

>>> x = np.array([[[1,2,3],[4,5,6],[7,8,9]], [[10, 11, 12], [13, 14, 15], [16, 17, 18]]]) * 1.0 
 
>>> x 
array([[[  1.,   2.,   3.], 
        [  4.,   5.,   6.], 
        [  7.,   8.,   9.]], 
 
       [[ 10.,  11.,  12.], 
        [ 13.,  14.,  15.], 
        [ 16.,  17.,  18.]]]) 
 
>>> x / np.sum(x, axis=0) 
array([[[ 0.09090909,  0.15384615,  0.2       ], 
        [ 0.23529412,  0.26315789,  0.28571429], 
        [ 0.30434783,  0.32      ,  0.33333333]], 
 
       [[ 0.90909091,  0.84615385,  0.8       ], 
        [ 0.76470588,  0.73684211,  0.71428571], 
        [ 0.69565217,  0.68      ,  0.66666667]]]) 

请您参考如下方法:

只需将全零列设置为任意非零值,然后像以前一样继续:

>>> x = np.array([[1., 0., 1.], 
...               [1., 0., 2.], 
...               [2., 0., 1.]]) 
>>> x[:, np.all(x == 0, axis=0)] = 1 
>>> x / np.sum(x, axis=0) 
array([[ 0.25      ,  0.33333333,  0.25      ], 
       [ 0.25      ,  0.33333333,  0.5       ], 
       [ 0.5       ,  0.33333333,  0.25      ]])