Применить преобразование к вектору Numpy, используя значения в других векторах - PullRequest
0 голосов
/ 13 июля 2020

Предположим, у меня есть 1D Numpy массив t (скажем, длины len_t), содержащий значения, которые я хочу применить к определенному математическому преобразованию. Вдобавок предположим, что у меня есть 4 массива 1D Numpy a1, k1, k2 и d, все одинаковой длины (скажем, len_p). Математическое преобразование, которое я хочу применить к t, включает все эти параметры. Поэтому я хочу получить массив Numpy формы (len_p, len_t), содержащий преобразованные значения t, преобразованные с использованием каждого значения a1, k1, k2 и d одно за другим. Для большей точности я хочу применить следующее преобразование: y = (a1*(t - d)*k1)/(k2+l1)*np.exp(l1*(t - d)) где l1 - простое число с плавающей запятой. Я не уточнял индексы, чтобы не перевесить обозначения. Если мое объяснение неясно, скажите, пожалуйста. Есть ли у кого-нибудь идеи, как мне действовать? Я не показываю больше кода, поскольку в будущем я перейду к другим аналогичным преобразованиям, и поэтому мне понадобится общий метод.

EDIT

В качестве примера скажем

t = [0 1 2]

и

a1 = [.5 .1]
k1 = [.01 .3]
k2 = [.7 .03]
d = [.2 .41]
l1 = 2

Я хочу получить двумерный массив, каждая строка которого содержит t значений, преобразованных набором параметров, имеющих одинаковые индексы в a1, k1, k2 и d. Следовательно, вывод будет

y = [[(a1[0]*(t[0] - d[0])*k1[0])/(k2[0]+l1)*np.exp(l1*(t[0] - d[0])) (a1[0]*(t[1] - d[0])*k1[0])/(k2[0]+l1)*np.exp(l1*(t[1] - d[0])) (a1[0]*(t[2] - d[0])*k1[0])/(k2[0]+l1)*np.exp(l1*(t[2] - d[0]))]
[(a1[1]*(t[0] - d[1])*k1[1])/(k2[1]+l1)*np.exp(l1*(t[0] - d[1])) (a1[1]*(t[1] - d[1])*k1[1])/(k2[1]+l1)*np.exp(l1*(t[1] - d[1])) (a1[1]*(t[2] - d[1])*k1[1])/(k2[1]+l1)*np.exp(l1*(t[2] - d[1]))]]

Итак, с числовыми значениями это идет

y = [[(.5*(0 - .2)*0.01)/(.7+2)*np.exp(2*(0 - .2)) (.5*(1 - .2)*0.01)/(.7+2)*np.exp(2*(1 - .2)) (.5*(2 - .2)*0.01)/(.7+2)*np.exp(2*(2 - .2))]
    [(.1*(0 - .41)*.3)/(.03+2)*np.exp(2*(0 - .41)) ((.1*(1 - .41)*.3)/(.03+2)*np.exp(2*(1 - .41)) (.1*(2 - .41)*.3)/(.03+2)*np.exp(2*(2 - .41))]]

1 Ответ

0 голосов
/ 13 июля 2020

Сначала преобразуйте свои переменные в массивы Numpy:

  • t - в «обычный» (строковый) массив,
  • все остальные - в столбчатые массивы (что-то вроде того, что вы использовали np.newaxis в упрощенном выражении):

Код для этого:

t  = np.array(t)
a1 = np.c_[np.array(a1)]
k1 = np.c_[np.array(k1)]
k2 = np.c_[np.array(k2)]
d  = np.c_[np.array(d)]

Затем запустите ваше упрощенное выражение:

y = (a1 * (t - d) * k1)/(k2 + l1) * np.exp(l1 * (t - d))

Чтобы сравнить оба результата (ваш и мой), запустите np.set_printoptions(suppress=True) раньше. В противном случае результаты были бы напечатаны в нотации "exp", что затрудняет сравнение. Вы также можете настроить параметр точность .

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