Python 有关带等式和指示符的输出阵列的更多信息

Python 有关带等式和指示符的输出阵列的更多信息,python,numpy,vectorization,Python,Numpy,Vectorization,我有一个数学函数,它的输出由两个变量定义,x和y 函数是e^(x^3+y^2) 我想计算x和y的1和某个定义的整数之间的每个可能的整数组合,并将它们放在一个数组中,以便每个输出与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) 我觉得这是一个很容易解

我有一个数学函数,它的输出由两个变量定义,
x
y

函数是
e^(x^3+y^2)

我想计算
x
y
的1和某个定义的整数之间的每个可能的整数组合,并将它们放在一个数组中,以便每个输出与
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
导入数学
将numpy作为np导入
方程=数学表达式(x**3+y**2)
#从1开始,而不是从零开始
i=1
j=1
#我想要一个数组输出
输出=[]
#作用
定义形状f(i,j):
形状=[]
output.append(形状)
当i

最近我得到了一个空白数组,但我也得到了一个值(int而不是数组)

我不确定是否有缩进错误,但看起来你从未对函数
的输出执行过任何操作。您应该将方程定义为函数,而不是表达式赋值。然后,您可以创建一个函数来填充所描述的列表列表

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]]

我不确定您是否有缩进错误,但看起来您从未对函数
shape\u 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]]

我们可以用
numpy
非常简单地做到这一点

首先,我们使用
np.arange
x
y
生成从0(简化索引)到最大值的值范围。我们可以以矢量化的方式执行幂运算,以获得
x^3
y^2
的值

接下来,我们可以应用
np。在
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

我们可以用
numpy
非常简单地做到这一点

首先,我们使用
np.arange
x
y
生成从0(简化索引)到最大值的值范围。我们可以以矢量化的方式执行幂运算,以获得
x^3
y^2
的值

接下来,我们可以应用
np。在
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

一个简单的解决方案是在函数中使用numpy的功能:

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)

这些操作将
i
放入包含
y
元素的列中,
j
放入包含
x
元素的行中。求幂运算不会改变这些形状。将两个阵列添加到一起时,将发生广播。一个数组中的单位维度将扩展到另一个数组中的相应维度。结果是一个
y
-by-
x
矩阵。

一个简单的解决方案是在函数中使用numpy的功能:

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)

这些操作将
i
放入包含
y
元素的列中,
j
放入包含
x
元素的行中。求幂运算不会改变这些形状。将两个阵列添加到一起时,将发生广播。一个数组中的单位维度将扩展到另一个数组中的相应维度。结果是一个
y
-by-
x
矩阵。

您需要阅读更多关于python中基本迭代的信息<代码>而
循环不会自动递增。在这里发布之前,有几个非常明显的问题你可能需要研究一下。您将
numpy
作为
np
导入,但实际上并不在任何地方使用它,这是一个危险信号。但更重要的是,您试图在某个对象上循环(
while
),但在循环之外增加循环控制变量-这是行不通的。如果使用
np.exp
,您可以将整个数组传递给func,而不是一次迭代一个标量对。您需要阅读更多有关python基本迭代的信息<代码>而
循环不会自动递增。在这里发布之前,有几个非常明显的问题你可能需要研究一下。您将
numpy
作为
np
导入,但实际上并不在任何地方使用它,这是一个危险信号。但更重要的是,您试图在某个对象上循环(
while
),但在循环之外增加循环控制变量-这是行不通的。如果使用
np.exp
,您可以将整个数组传递给func,而不是一次迭代一个标量对。+1应该在arange之外(请参阅我的答案)
np.e**…
可能更好地表示为'np.exp(…)`,但我喜欢您使用外部代替广播。
+1
位于内部的原因是它允许
result[x,y]
自然映射到
f(x,y)
。OP希望从1开始索引,但这是一个有效的方法,因为它产生了一个答案的超集+1应该在arange之外(见我的答案)
np.e**…
可能更好地表示为'np.exp(…)`,但我喜欢您使用外部代替广播。
+1
位于内部的原因是它允许
result[x,y]
自然映射到
f(x,y)
。OP希望从1开始索引,但这是一个有效的方法,因为它产生了答案的超集