Python中与Wolfram Table[]函数等效的方法

4
在 Wolfram Mathematica 中,我经常使用 Table[] 函数。 Table 函数示例:

enter image description here

i1^2 + i3^3 可以是任何参数 (i1,i3) 的函数。
{i1, 1, 9, 2},
5,
{i3, 7, 3, -.5}

是参数空间。

更多详情请参阅文档: https://reference.wolfram.com/language/ref/Table.html

在 Python 中,我可以使用一系列 for 循环来完成这个操作,代码如下:

import numpy as np



def f(i1,i3):
    return(i1**2+i3**3)
    
arr=np.array([[[
        
        f(i1,i3)
        
        for i3 in np.arange(7,2.5,-.5)]
        for i2 in np.arange(5)]
        for i1 in np.arange(1,11,2)]
        )
print(arr)

有没有更短、更紧凑的方法来做这件事?

Python的符号代数模块是sympy,它可能有类似的功能。 - Barmar
你可以尝试使用np.array(list(map(f, np.dstack(np.meshgrid(a, c)).reshape((len(a)*len(c), 2))))).reshape((len(c), len(a))),但你需要复制每个内部数组五次。其中a, c分别对应于i3, i1的范围。你还需要稍微更新一下f函数。 - tobias
如果您不关心MatrixForm部分(也许您只是用它来显示答案),则可以使用以下代码: list(map(lambda i1: list(map(lambda i3: i1**2 + (i3/2)**2, range(7*2,3*2-1, -1))), range(1, 9+1, 2))) - Well...
1个回答

0

我最近开始学习Python,这是我从Mathematica中错过的东西之一。 下面我提供了一个函数来回答问题,但它只适用于输出为数字表而非符号表的情况。如果读者需要一个符号表,则Python包Sympy中的FunctionMatrix可能会有所帮助。

代码:

import itertools
import numpy as np
    
def table(f,*arg) :
    return np.array([f(*a) for a in itertools.product(*arg)]).reshape(*map(len,arg))

示例:

输入:table(lambda a,b : a+b, np.arange(1,3),np.arange(1,5))

输出:array([[2, 3, 4, 5],[3, 4, 5, 6]])

输入:table(lambda a,b,c : a**2+b**3+c**4, np.arange(2,4),np.arange(1,5),np.arange(1,3))

输出:

array([[[ 6, 21],
        [13, 28],
        [32, 47],
        [69, 84]],

        [[11, 26],
        [18, 33],
        [37, 52],
        [74, 89]]])

OP在图片中的示例是通过以下方式获得的

table(lambda a,b,c : a**3+c**3,np.arange(1,11,2), np.arange(5), np.arange(7,2.5,-.5))

我没有能力(也没有真正尝试)将OP的for循环代码翻译成Mathematica,并且我不知道在上述表格函数中使用哪些数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接