Delete positive elements of each row except diagonal elements in Python

Question:

I have an array A. I want to delete all positive elements of a row and replace it with zero but not the diagonal elements. But I am getting an error. I present the expected output.

import numpy as np
A=np.array([[1,-2,3],[1,2,6],[-7,8,-2]])
A=np.delete(np.where(A>0, A, 0).sum(axis=1))
print(A)

The error is

in <module>
    A=np.delete(np.where(A>0, A, 0).sum(axis=1))

  File "<__array_function__ internals>", line 4, in delete

TypeError: _delete_dispatcher() missing 1 required positional argument: 'obj'

The expected output is

array([[1,-2,0],[0,2,0],[-7,0,-2]])
Asked By: bekarhunmain

||

Answers:

An easy option is to repair the diagonal:

B = np.where(A>0, A, 0)
np.fill_diagonal(B, A.diagonal())
print(B)

Note that this creates a new array, while the second approach below modifies A in place.

Another approach might be to get the x/y indices of the 2D array for which the value is 0 and only keep those not on the diagonal (x!=y):

x, y = np.where(A>0)
m = x!=y
A[x[m], y[m]] = 0

Output:

[[ 1 -2  0]
 [ 0  2  0]
 [-7  0 -2]]
Answered By: mozway
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.