'normalize multi dimensional numpy array using the last value along axis 1

I have the following numpy array :

A = np.array([[1,2,3,4,5],
             [15,25,35,45,55]])

I would like to create a new array with the same shape by dividing each dimension by the last element of the dimension

The output desired would be :

B = np.array([[0.2,0.4,0.6,0.8,1],
              [0.27272727,0.45454545,0.63636364,0.81818182,1]])

Any idea ?



Solution 1:[1]

Slice the last element while keeping the dimensions and divide:

B = A/A[:,[-1]]  # slice with [] to keep the dimensions

or, better, to avoid an unnecessary copy:

B = A/A[:,-1,None]

output:

array([[0.2       , 0.4       , 0.6       , 0.8       , 1.        ],
       [0.27272727, 0.45454545, 0.63636364, 0.81818182, 1.        ]])

Solution 2:[2]

You can achieve this using:

[list(map(lambda i: i / a[-1], a)) for a in A]

Result:

[[0.2, 0.4, 0.6, 0.8, 1.0], [0.2727272727272727, 0.45454545454545453, 0.6363636363636364, 0.8181818181818182, 1.0]]

Solution 3:[3]

Adding on @mozway answer, it seems to be faster to take the last column and then add an axis with:

B = A/A[:,-1][:,None]

for instance.

See the benchmark: enter image description here

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 PySoL
Solution 3 Learning is a mess