Ronnie Ron
Ronnie Ron

Reputation: 13

Merge two arrays with the same dimension based on a condition

I have two arrays with the same dimension:

a = [
[1, 1, 1, 1],
[1, 0, 0, 1],
[1, 0, 0, 1],
[1, 1, 1, 1], ]

b = [
[0, 1, 1, 0],
[0, 0, 0, 0],
[2, 0, 0, 2],
[0, 0, 0, 0], ]

I would like to create a new one, only changing the values where B is not 0 and is different than A. The result would be:

c = [
[1, 1, 1, 1],
[1, 0, 0, 1],
[2, 0, 0, 2],
[1, 1, 1, 1], ]

How can I do this?

Upvotes: 0

Views: 97

Answers (3)

Petr L.
Petr L.

Reputation: 480

You don't need numpy. Here is a solution you can actually read line by line:

a = [
[1, 1, 1, 1],
[1, 0, 0, 1],
[1, 0, 0, 1],
[1, 1, 1, 1], ]

b = [
[0, 1, 1, 0],
[0, 0, 0, 0],
[2, 0, 0, 2],
[0, 0, 0, 0], ]

c = a[:]
#I would like to create a new one, only changing the values where B is not 0 and is different than A. The result would be:

for lineindex,line in enumerate(a):
    for index,x in enumerate(line):
        if x != b[lineindex][index] and b[lineindex][index] != 0:
            c[lineindex][index] = b[lineindex][index]
print(c)

Upvotes: 0

loopy walt
loopy walt

Reputation: 968

Here is one that I find easy to parse:

>>> np.where(b,b,a)
array([[1, 1, 1, 1],
       [1, 0, 0, 1],
       [2, 0, 0, 2],
       [1, 1, 1, 1]])

This picks each value from either the third or second arguments based on whether the first argument is zero or not.

Upvotes: 2

akuiper
akuiper

Reputation: 215047

You can do assignment with boolean conditions:

a[b != 0] = b[b != 0]

a
array([[1, 1, 1, 1],
       [1, 0, 0, 1],
       [2, 0, 0, 2],
       [1, 1, 1, 1]])

Upvotes: 2

Related Questions