I want to normalize the elements of columns in array ‘x’, which contains both positive and negative numbers, to -1, or 1.
Negative elements of x should be normalized to x.min of each column where x.min becomes - 1, and positive elements of x should be normalized to x.max of each column where x.max becomes 1. Zero values should remain zero.
I can get part of the way there using:
x = np.array([[ 1,  3,  1  ],
              [-2, -5, -0.5],
              [-3, -1,  1.5],   
              [ 2,  7,  2  ]])
x_norm = x / x.max(axis=0)
print(x_norm)
[[ 0.5         0.42857143  0.5       ]
 [-1.         -0.71428571 -0.25      ]
 [-1.5        -0.14285714  0.75      ]
 [ 1.          1.          1.        ]]
But really I want the result to be:
print(x_norm)
[[ 0.5         0.42857143  0.5       ]
 [-0.66       -1.         -1.        ]
 [-1.         -0.2         0.75      ]
 [ 1.          1.          1.        ]]
You can check the condition with np.where and apply two different normalizations based on the condition:
np.where(x<0, -x / x.min(axis=0), x / x.max(axis=0))
Out[6]: 
array([[ 0.5       ,  0.42857143,  0.5       ],
       [-0.66666667, -1.        , -1.        ],
       [-1.        , -0.2       ,  0.75      ],
       [ 1.        ,  1.        ,  1.        ]])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With