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]])
>Solution :
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]]