Как инвертировать только отрицательные элементы в матрице NumPy? - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть матрица, содержащая положительные и отрицательные числа, например:

>>> source_matrix
    array([[-4, -2,  0],
           [-5,  0,  4],
           [ 0,  6,  5]])

Я хотел бы получить копию этой матрицы с инвертированными отрицательными числами:

>>> result
    array([[-0.25, -0.5,  0],
           [-0.2,  0,  4],
           [ 0,  6,  5]])

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вы также можете достичь этого без маскировки, используя параметры where и out true_divide.

a = np.array([[-4, -2,  0],
              [-5,  0,  4],
              [ 0,  6,  5]], dtype=np.float)

np.true_divide(1, a, out=a, where=a<0)

. Получите результат:

array([[-0.25, -0.5 ,  0.  ],
       [-0.2 ,  0.  ,  4.  ],
       [ 0.  ,  6.  ,  5.  ]])

where= параметру передается массив тех же размеров, что и ваши два входа.Где это оценивается как True, деление выполняется.Если значение равно False, исходный ввод, переданный через out=, выводится в результат без изменений.

0 голосов
/ 21 сентября 2018

Во-первых, так как ваш требуемый массив будет содержать тип с плавающей точкой, вам необходимо определить dtype массива во время создания как float.Причина этого заключается в том, что если вы присваиваете результаты с плавающей запятой для инвертированного подмассива, они автоматически преобразуются в плавающие.Во-вторых, вам нужно найти отрицательные числа в вашем массиве, а затем использовать простое индексирование, чтобы захватить их и использовать np.true_divide() для выполнения инверсии.

In [25]: arr = np.array([[-4, -2,  0],
    ...:                 [-5,  0,  4],
    ...:                 [ 0,  6,  5]], dtype=np.float)
    ...:            
    ...:            

In [26]: mask = arr < 0

In [27]: arr[mask] = np.true_divide(1, arr[mask])

In [28]: arr
Out[28]: 
array([[-0.25, -0.5 ,  0.  ],
       [-0.2 ,  0.  ,  4.  ],
       [ 0.  ,  6.  ,  5.  ]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...