在Python中,如何在函数中定义任意数量的索引变量?

2024-10-03 09:13:17 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,提前感谢您接受我对Python的初学者理解。我来自MATLAB,希望这能提供一些背景知识

在MATLAB中,我将数学函数定义为:

f =@ (x) 2*x(1)^2 + 4*x(2)^3

在Python中,我写道:

def f(x):
   return 2*x(1)**2 + 4*x(2)**3

但我的另一个函数(创建梯度向量的有限差分法)中有一个错误:

line 9, in f
    return 2*x(1)**2 + 4*x(2)**3
TypeError: 'numpy.ndarray' object is not callable

(包含n个条目的输入X1,由原始方程中的变量数量指定,反馈到函数f(x)中,以在特定点进行计算)

更新2021-10-22 下面我已经包含了代码以供参考此代码当前有效。

我想知道的主要事情是,我如何为一个方程创建任意数量的变量,就像我在MATLAB中使用x(1),x(2)…x(n)所做的那样。有人告诉我应该使用def f(*x),但是当我在f(x)上添加“*”操作符时,我得到了一个tuple index out of range错误

import math, numpy as np

def gradFD(var_init,fun,hx):
    df = np.zeros((len(var_init),1)) #create column vector for gradient output


    # Loops each dimension of the objective function
    for i in range(0,len(var_init)):
        x1 = np.zeros(len(var_init)) #initialize x1 vector
        x2 = np.zeros(len(var_init))
        x1[i] = var_init[i] - hx
        x2[i] = var_init[i] + hx

        z1 = fun(x1)
        z2 = fun(x2)

        # Calculate Slope
        df[[i],[0]] = (z2 - z1)/(2*hx)
        


    # Outputs:
    c = df #gradient column vector

    return c

和测试脚本:

import math
import numpy as np
from gradFD import gradFD

def f(x):
    return 2*x[0]**2 + 4*x[1]**3 #THIS IS THE NOW WORKING CODE
    #return 2*x**2 + 4*y**3
var_init = [1,1] #point to evaluate equation at

c = gradFD(var_init,f,1e-3)
print(c)

Tags: 函数importnumpydflenreturninitvar
2条回答

Python中的数组索引是用方括号而不是圆括号完成的。请记住,Python从索引0开始,而不是1

def f(x):
    return  2*x[0]**2 + 4*x[1]**3

您的函数被调用f,但您正试图调用x(2)。出现错误是因为您试图将x作为函数调用,但x是一个numpy数组

相关问题 更多 >