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开始索引,但这是一个有效的方法,因为它产生了答案的超集