Есть ли быстрый способ замены элементов массива np.array, которые содержат только 1 и -1 - PullRequest
2 голосов
/ 01 февраля 2020

Скажем, M - это двумерный массив numpy формы (1024,1024), записи которого имеют значения 1 или -1. Я хочу заменить каждую запись x на exp(-x). Есть ли более быстрый способ сделать это, чем использовать функцию numpy.exp(-M), чтобы использовать тот факт, что элементы входной матрицы принимают только небольшое количество различных значений?

Ответы [ 2 ]

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

Это то, что вам нужно? Если это так, я думаю, что это быстрее, чем любая операция, включающая условную оценку (а также использование np.exp(), как показал Марк Снайдер - спасибо Марку).

import numpy as np
from math import e

M = np.random.randint(2, size=(1024,1024)) * 2 - 1

a = (1/e - e) / 2
b = (1/e + e) / 2

E = M * a + b

print(M[:3,:3])
# [[-1  1  1]
#  [-1 -1  1]
#  [-1  1 -1]]

print(E[:3,:3])
# [[2.71828183 0.36787944 0.36787944]
#  [2.71828183 2.71828183 0.36787944]
#  [2.71828183 0.36787944 2.71828183]]

На самом деле, линейное преобразование, подобное этому может использоваться в любое время, когда матрица со значениями p и q должна быть преобразована в матрицу со значениями r и s. Нужно только решить систему

r = p * a + b
s = q * a + b

для a и b. Типовое решение c

a = (r - s) / (p - q)
b = r - p * a = s - q * a = (p * s - q * r) / (p - q)
1 голос
/ 01 февраля 2020

Сравнительный анализ вашего первоначального решения с ответом Уолтера Тросса:

timeit np.exp(-M)
9.29 ms ± 57.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

timeit M*a+b
6.42 ms ± 18.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...