James Mertz
James Mertz

Reputation: 8789

How do I combine two numpy arrays element wise in python?

I have two numpy arrays:

A = np.array([1, 3, 5, 7])
B = np.array([2, 4, 6, 8])

and I want to get the following from combining the two:

C = [1, 2, 3, 4, 5, 6, 7, 8]

I'm able to get something close by using zip, but not quite what I'm looking for:

>>> zip(A, B)
[(1, 2), (3, 4), (5, 6), (7, 8)]

How do I combine the two numpy arrays element wise?


I did a quick test of 50,000 elements in each array (100,000 combined elements). Here are the results:

User Ma3x:      Time of execution: 0.0343832323429      Valid Array?:  True
User mishik:    Time of execution: 0.0439064509613      Valid Array?:  True
User Jaime:     Time of execution: 0.02767023558        Valid Array?:  True

Tested using Python 2.7, Windows 7 Enterprise 64-bit, Intel Core i7 2720QM @2.2 Ghz Sandy Bridge, 8 GB Mem

Upvotes: 14

Views: 32435

Answers (6)

John Poulis
John Poulis

Reputation: 69

With:

A = np.array([1, 3, 5, 7])
B = np.array([2, 4, 6, 8])

You can use:

np.array([A, B]).transpose().flatten().tolist()

And it works with any number of arrays as well.

Upvotes: 0

gashero
gashero

Reputation: 41

>>> import numpy as np
>>> A=np.array([1,3,5,7])
>>> B=np.array([2,4,6,8])
>>> C=np.dstack([A,B])
>>> D=C.reshape((1,8))[0]
>>> D
array([1, 2, 3, 4, 5, 6, 7, 8])

Upvotes: 4

J. Martinot-Lagarde
J. Martinot-Lagarde

Reputation: 3550

You can also use slices :

C = np.empty((A.shape[0]*2), dtype=A.dtype)
C[0::2] = A
C[1::2] = B

Upvotes: 6

Jaime
Jaime

Reputation: 67507

Use np.insert:

>>> A = np.array([1, 3, 5, 7])
>>> B = np.array([2, 4, 6, 8])
>>> np.insert(B, np.arange(len(A)), A)
array([1, 2, 3, 4, 5, 6, 7, 8])

Upvotes: 11

Ma3x
Ma3x

Reputation: 6589

Some answers suggested sorting, but since you want to combine them element-wise sorting won't achieve the same result.

Here is one way to do it

C = []
for elem in zip(A, B):
    C.extend(elem)

Upvotes: 3

mishik
mishik

Reputation: 10003

You can try this:

C = sorted(A.tolist() + B.tolist())
  1. A.tolist() will yield [1, 3, 5, 7]
  2. B.tolist() will yield [2, 4, 6, 8]
  3. A.tolist() + B.tolist() - [1, 3, 5, 7, 2, 4, 6, 8]
  4. sorted(...) - [1, 2, 3, 4, 5, 6, 7, 8]

Without sorting:

C = [y for x in zip(A, B) for y in x]

Upvotes: 0

Related Questions