# 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]]`

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]
``````

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
``````

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]])
``````
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.