如何在Python中预先分配任意大小的矩阵并将其填充到for循环中

2024-05-12 20:51:00 发布

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

我对Python比较新(习惯于在IDL和MATLAB中工作),并且正在尝试习惯Python如何“索引”数组。我正在尝试启动一个7x13矩阵并将其填充到for循环中:

def func(theta2, phi2):
    sph = [[[] for l in range(6)] for m in range(12)] 
    for l in range(0,6):
        for m in range(-6,6):
            sph[l,m]=np.real(np.conjugate(sph_harm(m,l,phi2,theta2))*np.sin(theta2))
    return sph

f = func(np.pi/4,np.pi/4)

这将导致以下错误:“TypeError:list索引必须是整数,而不是元组 ". 如果删除变量“sph”上的[l,m]索引,我只得到1x1数组输出,而不是所需的7x13数组输出。在

我还尝试将for循环全部删除,并将其组合成一行:

^{pr2}$

这导致了12个1x6阵列的列表,这也不是我想要的。在

这篇文章类似于这篇文章:How to initialize a two-dimensional array in Python?,但我似乎不知道如何正确地实现这里的回复中所建议的内容。在

我该如何着手解决这个问题?在


Tags: infornppirange矩阵数组idl
2条回答

在NumPy中,你不应该写循环。在

将您的ml,定义为数组,这里称为xy,为数组:

zeros = np.zeros((7, 13))
x = zeros + np.arange(7).reshape(7, 1)
y = zeros + np.arange(-6, 7)

编写您的函数sph_harm(),以便它能与整个数组一起工作。例如:

^{pr2}$

现在,创建数组要简单得多,同样要处理整个数组:

def func(theta2, phi2):
    zeros = np.zeros((7, 13))
    x = zeros + np.arange(7).reshape(7, 1)
    y = zeros + np.arange(-6, 7)
    return np.real(np.conjugate(sph_harm(x, y, phi2, theta2)) * np.sin(theta2))

f = func(np.pi/4, np.pi/4)

改变

sph[l,m]=np.real(np.conjugate(sph_harm(m,l,phi2,theta2))*np.sin(theta2))

进入

^{pr2}$

以及

>>> list(range(6))
[0, 1, 2, 3, 4, 5]
>>> list(range(0,6))
[0, 1, 2, 3, 4, 5]

范围(n)提供从0到n-1的列表

相关问题 更多 >