0

I have two arrays, Result and X. I would like to add non-zero row elements of Result to each element of X. The desired output is attached.

import numpy as np
Result=np.array([[ 0.        ,  -2.46421304,  -4.99073939,  -5.79902063,  0.        ],
       [-10.        ,  0.        ,  -4.99073939,  0.        ,  0.        ],
       [-10.        ,  -2.46421304,  0.        ,  -5.79902063,  0.        ],
       [-10.        ,  0.        ,  -4.99073939,  0.        ,  0.        ],
       [ 0.        ,  -2.46421304,  -4.99073939,  -5.79902063,  0.        ]])

X=np.array([10,2.46421304,4.99073939,5.79902063,0])

Desired output:

array([[ 0.        ,  10-2.46421304,  10-4.99073939,  10-5.79902063,  0.        ],
       [2.46421304-10.        ,  0.        ,  2.46421304-4.99073939,  0.        ,  0.        ],
       [4.99073939-10.        ,  4.99073939-2.46421304,  0.        ,  4.99073939-5.79902063,  0.       ],
       [5.79902063-10.        ,  0.        ,  5.79902063-4.99073939,  0.        ,  0.        ],
       [ 0.        ,  0-2.46421304,  0-4.99073939,  0-5.79902063,  0.        ]])

2 Answers 2

1

One option is to use numpy.where to check if a value in Result is 0 or not and add accordingly:

out = np.where(Result!=0, X[:, None] + Result, Result)

Output:

array([[ 0.        ,  7.53578696,  5.00926061,  4.20097937,  0.        ],
       [-7.53578696,  0.        , -2.52652635,  0.        ,  0.        ],
       [-5.00926061,  2.52652635,  0.        , -0.80828124,  0.        ],
       [-4.20097937,  0.        ,  0.80828124,  0.        ,  0.        ],
       [ 0.        , -2.46421304, -4.99073939, -5.79902063,  0.        ]])
Sign up to request clarification or add additional context in comments.

Comments

0

You should accept enke's answer, but here's another way of doing it using np.repeat:

out = Result + np.repeat(X[:, np.newaxis], 5, axis=1) * (Result != 0)

I think the effect of None and np.newaxis is the same in this context vs the other answer.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.