Заменить значение матрицы пустышки Python на основе условия без использования цикла for - PullRequest
3 голосов
/ 31 октября 2019

Например, у меня есть симметричная матовая матрица.

 matrix([[0.   , 0.125, 0.75 , 0.   , 0.   ],
            [0.125, 0.   , 0.   , 0.   , 0.   ],
            [0.75 , 0.   , 0.   , 0.   , 0.375],
            [0.   , 0.   , 0.   , 0.   , 1.2  ],
            [0.   , 0.   , 0.375, 1.2  , 0.   ]])

Если значение в массиве больше нуля, можно ли заменить это значение умножением суммы данной строки и столбца. Например, 0,125 будет заменено на 0,109375, так как row_sum * col_sum = 0,125 * (0,125 + 0,75) = 0,109375.

Я знаю, что это можно сделать с помощью цикла for, но возможно ли это сделать с помощью стандартных библиотек numpy, которых я хочу избежать для циклов.

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Объявление данной матрицы

import numpy as np
arr=np.array([[0.   , 0.125, 0.75 , 0.   , 0.   ],
            [0.125, 0.   , 0.   , 0.   , 0.   ],
            [0.75 , 0.   , 0.   , 0.   , 0.375],
            [0.   , 0.   , 0.   , 0.   , 1.2  ],
            [0.   , 0.   , 0.375, 1.2  , 0.   ]])

с использованием списка и np.argwhere для условных индексов:

def replace(x,y,arr=arr,column_sums=arr.sum(axis=0),row_sum=arr.sum(axis=1)):
    arr[x][y]=row_sum[x]*column_sums[y]

_=[replace(x,y) for x,y in np.argwhere(arr>0)]

Вывод:

array([[0.      , 0.109375, 0.984375, 0.      , 0.      ],
       [0.109375, 0.      , 0.      , 0.      , 0.      ],
       [0.984375, 0.      , 0.      , 0.      , 1.771875],
       [0.      , 0.      , 0.      , 0.      , 1.89    ],
       [0.      , 0.      , 1.771875, 1.89    , 0.      ]])

Обратите внимание, что код может быть более оптимизирован, чтобы его лучше понять

0 голосов
/ 31 октября 2019

Как насчет использования функций индексирования numpy?

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