Больше информации о выходном массиве с уравнением и показателями - PullRequest
0 голосов
/ 24 июня 2019

У меня есть математическая функция, выход которой определяется двумя переменными, x и y.

Функция e^(x^3 + y^2).

Я хочу вычислить каждую возможную целочисленную комбинацию между 1 и некоторым определенным целым числом для x и y и поместить их в массив так, чтобы каждый выход выровнялся с соответствующими значениями x и y индекс. Так что-то вроде:

Дано:

x = 3
y = 5

вывод будет выглядеть как массив:

f(1,1) f(1,2) f(1,3)
f(2,1) f(2,2) f(2,3)
f(3,1) f(3,2) f(3,3)
f(4,1) f(4,2) f(4,3)
f(5,1) f(5,2) f(5,3)

Я чувствую, что это легко решить, но у меня ограниченные знания. Код, который следует, является лучшим описанием.

import math 
import numpy as np

equation = math.exp(x**3 + y**2)

#start at 1, not zero
i = 1
j = 1

#i want an array output
output = []

#function
def shape_f (i,j):
    shape = []
    output.append(shape)
    while i < x + 1:
        while j < y +1: 
            return math.exp(i**3 + j**2)

#increase counter
i = i +1
j = j +1
print output

Недавно я получил пустой массив, но я также получил одно значение (int вместо массива)

Ответы [ 3 ]

1 голос
/ 24 июня 2019

Мы можем сделать это очень просто с помощью numpy.

Сначала мы используем np.arange, чтобы сгенерировать диапазон значений от 0 (для упрощения индексации) до максимального значения как для x, так и для *1005*.y.Мы можем выполнить возведение в степень векторизованным способом, чтобы получить значения x^3 и y^2.

Далее мы можем применить np.add к внешнему произведению x^3 и y^3, чтобы получить каждую возможную их комбинацию.Последним шагом является естественная экспонента результата:

x_max = 3
y_max = 5

x = np.arange(x_max + 1) ** 3
y = np.arange(y_max + 1) ** 2

result = np.e ** np.add.outer(x, y)

print(result[2, 3]) # e^(2 ** 3 + 3 ** 2)

Вывод:

24154952.753575277
1 голос
/ 24 июня 2019

Я не уверен, есть ли у вас ошибка отступа, но похоже, что вы никогда ничего не делаете с выводом функции shape_f. Вы должны определить свое уравнение как функцию, а не как выражение выражения. Затем вы можете создать функцию, которая заполняет список списков, как вы описываете.

import math

def equation(x, y):
    return math.exp(x**3 + y**2)

def make_matrix(x_max, y_max, x_min=1, y_min=1):
    out = []
    for i in range(x_min, x_max+1):
        row = []
        for j in range(y_min, y_max+1):
            row.append(equation(i, j))
        out.append(row)
    return out

matrix = make_matrix(3, 3)
matrix
# returns:
[[7.38905609893065, 148.4131591025766, 22026.465794806718],
 [8103.083927575384, 162754.79141900392, 24154952.7535753],
 [1446257064291.475, 29048849665247.426, 4311231547115195.0]]
0 голосов
/ 24 июня 2019

Тривиальным решением было бы использование функции широковещания numpy с функцией exp:

x = 3
y = 5

i = np.arange(y).reshape(-1, 1) + 1
j = np.arange(x).reshape(1, -1) + 1

result = np.exp(j**3 + y**2)

Операции reshape превращают i в столбец с y элементами и j в строку с x элементами. Возведение в степень не меняет эти формы. Трансляция происходит, когда вы добавляете два массива вместе. Размеры модуля в одном массиве расширяются до соответствующего размера в другом. В результате получается матрица y -by- x.

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