Матрица: поместите только отрицательное значение в диагональную позицию в массиве numpy - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть вопрос о перестановке массива numpy, у меня есть массив numpy, это выглядит так:

numpy_array = np.array([[  1,   2,   3,   4, -10],
                        [ -4,   1,   1,   1,   1],
                        [  2,  -7,   1,   1,   3],
                        [  1,   6, -12,   2,   3],
                        [  0,   3,   1,  -4,   0]])

Я хотел бы переставить этот массив: отрицательное значение на каждом строка будет в диагональной позиции, то есть поменяйте местами отрицательный элемент с диагональной позицией, поэтому в конце я получу новый массив:

numpy_array_new = np.array([[-10,   2,   3,   4,   1],
                            [  1,  -4,   1,   1,   1],
                            [  2,   1,  -7,   1,   3],
                            [  1,   6,   2, -12,   3],
                            [  0,   3,   1,   0,  -4]])

Моя идея состоит в том, чтобы используйте

np.fill_diagonal(numpy_array, 0)

конечно, заполните диагональ отрицательными элементами не с 0, но с отрицательным элементом в каждой строке, кто-нибудь знает об этом? Спасибо за помощь

Ответы [ 2 ]

4 голосов
/ 25 февраля 2020

Я предполагаю, что в строке есть только одно отрицательное значение.

Следующий код возвращает желаемую матрицу без какой-либо для l oop.

# Find negative elements and their index in a row 
negative_indices =np.where(arr < 0)
negative_elements = arr[negative_indices]
diagonal_elements = arr.diagonal()

# Change negative elements with current diagonal values 
arr[negative_indices] = diagonal_elements 

# Fill diagonal with the negative elements
np.fill_diagonal(arr, negative_elements)

print(arr)
0 голосов
/ 25 февраля 2020

Это еще один способ, основанный на обмене элементов по указанным c индексам:

idx_of_negatives = np.where(numpy_array < 0) 
# it's a tuple ([0, 1, 2, 3, 4], [4, 0, 1, 2, 3])

idx_of_diagonal = (np.arange(len(numpy_array)), np.arange(len(numpy_array)))
# it's a tuple ([0, 1, 2, 3, 4], [0, 1, 2, 3, 4])

numpy_array[idx_of_negatives], numpy_array[idx_of_diagonal] = 
numpy_array[idx_of_diagonal], numpy_array[idx_of_negatives]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...