设置一个带有参数的numpy数组

yv5phkfx  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(159)

我想创建一个矩阵,其中包含一系列常微分方程的参数。我有5个常微分方程,它们的所有参数都必须以一定的顺序出现在这个矩阵中
但我找不到最合理的方法来做这件事。我设置了一个5x 5的零矩阵,并试图用我的参数替换矩阵中的某些位置,但这些参数之前没有定义,我输入它们(未定义的值),因为我将在后面使用它们。我的代码是这样的:

import numpy as np

####create matrix

zeros = np.zeros((5,5))
params = ['-lambda', 'lambda', '-u-v', 'u', '-w', 'v', 'w','-gamma', 'gamma']
pos = [(0,0),(1,0),(1,1),(2,1),(2,2),(3,1),(3,2),(3,3),(4,3)]
rows, cols = zip(*pos)
zeros[rows, cols] = params

我尝试编码的东西看起来像这样:

---------------------------------编辑
所有这些的目的是,当我用另一个向量乘以我的矩阵时,我将留下我的ODE的方程(参见下面的示例,将第一行与向量相乘得到'dU',等等。

olhwl3o2

olhwl3o21#

我们可以只输入行和列作为x和y位置的单独lists;你可能想用变量uvwgamma_lambda(仅供参考)来填充numpy数组(变量的值)(仅供参考),变量的命名方式与现有的内置变量(如lambda)不同,lambda已经是一个函数,它具有一些语法糖,缩短了定义或调用函数的代码,这里有一个链接:How are lambdas useful?):

import numpy as np
zeros = np.zeros((5, 5))
_lambda = 1
u = 3
v = 4
w = 5
gamma = 6
params = [-_lambda, _lambda, -u-v, u, -w, v, w, -gamma, gamma]
posx = [0, 1, 1, 2, 2, 3, 3, 3, 4]
posy = [0, 0, 1, 1, 2, 1, 2, 3, 3]
zeros[posx, posy] = params

print(zeros)输出:

[[-1.  0.  0.  0.  0.]
 [ 1. -7.  0.  0.  0.]
 [ 0.  3. -5.  0.  0.]
 [ 0.  4.  5. -6.  0.]
 [ 0.  0.  0.  6.  0.]]

如果你真的想用你的问题中的str ing名称的list来填充数组(['-lambda', 'lambda', '-u-v', 'u', '-w', 'v', 'w','-gamma', 'gamma']),那么我们可以做同样的事情,但是我们需要将初始numpy数组的dtype也设置为str ing:

import numpy as np
zeros = np.zeros((5, 5)).astype(str)
params = ['-lambda', 'lambda', '-u-v', 'u', '-w', 'v', 'w','-gamma', 'gamma']
posx = [0, 1, 1, 2, 2, 3, 3, 3, 4]
posy = [0, 0, 1, 1, 2, 1, 2, 3, 3]
zeros[posx, posy] = params

print(zeros)输出:

[['-lambda' '0.0' '0.0' '0.0' '0.0']
 ['lambda' '-u-v' '0.0' '0.0' '0.0']
 ['0.0' 'u' '-w' '0.0' '0.0']
 ['0.0' 'v' 'w' '-gamma' '0.0']
 ['0.0' '0.0' '0.0' 'gamma' '0.0']]

如果我们想得到值,那么我们可以eval评估数组中的str

print(f'{zeros[-1, -2]}: {eval(zeros[-1, -2])}')

输出:

gamma: 6

相关问题