Sum rows of 2D array with elements of 1D array

Question:

I have two ndarrays:
a = [[1, 2], [100, 200]] and
b = [10, 20]

Is it possible to get such ndarray using numpy:
[[1 + 10, 2 + 10], [100 + 20, 200 + 20]]

Asked By: wowonline

||

Answers:

You just need to transpose the first array, perform the addition, then transpose back:

import numpy as np
a = np.array([[1, 2], [100, 200]])
b = np.array([10, 20])
x = a.T + b
print(x)
# [[ 11 120]
#  [ 12 220]]
print(x.T)
# [[ 11  12]
#  [120 220]]

Note that transposing an array is "free" so doing it several times is not a worry.




Edit: just for completeness, I have added a benchmarking test to compare all the approaches and they all seem to take the same time.

transposition: 0.180 ms
reshaping: 0.179 ms
newaxis: 0.181 ms
from contextlib import contextmanager
import numpy as np
from time import perf_counter
N = 10_000_000

@contextmanager
def time_this(message=""):
    t0 = perf_counter()
    yield
    dt = perf_counter() - t0
    print(f"{message}: {dt:.3f} ms")
    
a = np.random.random((N, 2))
b = np.random.random(N,)

with time_this("transposition"):
    (a.T + b).T    
with time_this("reshaping"):
    a + b.reshape(-1, 1)
with time_this("newaxis"):
    a + b[:,None]
Answered By: Guimoute

Yes, this is possible using reshape.

    import numpy as np
    a = np.array([[1, 2], [100, 200]])
    b = np.array([10, 20])
    
    result = a + b.reshape(-1, 1) # is a column
Answered By: Starnec

Another possible solution, which is based on numpy broadcasting:

a + b[:,None]

EXPLANATION

b[:,None]

is

array([[10],
       [20]])

So by summing the two arrays, the array

array([[10],
       [20]])

will be broadcasted and summed to each column of a, producing the wanted result.


Output:

array([[ 11,  12],
       [120, 220]])
Answered By: PaulS
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.