如何将一维数组转换为二维数组?

时间:2020-06-04 18:27:18

标签: python scipy sparse-matrix

我正在编写代码来求解2D热方程。我在x维度上有 nx 个点,在y维度上有 ny 个点。 (nx和ny是用户输入)。解决方案以形状数组(nx * ny,)的形式出现。但是自然地,我想将解决方案绘制为2D阵列。因此,我尝试将结果的值分配给另一个2D数组,如下所示:

# A is a (nx*ny, nx*ny) sparse square matrix of csc format. b is a (nx*ny,) NumPy array.
y = sp.linalg.bicgstab(A, b)    # shape of y is (nx*ny,)
solution = np.zeros((nx, ny))
for i in range(0, ny):
    for j in range(0, nx):
        solution[i, j] = y[i + nx * j]

但这会引发错误:

TypeError: only size-1 arrays can be converted to Python scalars

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:/Users/USER/Desktop/Numerical Practice/FDM-2D Heat Equation-No Source.py", line 86, in <module>
    main()
  File "C:/Users/USER/Desktop/Numerical Practice/FDM-2D Heat Equation-No Source.py", line 77, in main
    solution[i, j] = y[i + nx * j]
ValueError: setting an array element with a sequence.

Process finished with exit code 1

我要去哪里错了,我该怎么解决?我已经通过直接打印检查了初始结果(y)。 y正确显示。解决方案完成后会发生错误。

P.S。如果我使用函数sp.linalg.spsolve而不是sp.linalg.bicgstab,它可以正常工作。但是我正在探索稀疏的迭代求解器,因此我希望使用sp.linalg.bicgstab

2 个答案:

答案 0 :(得分:2)

您的代码有几个问题。

触发您观察到错误的原因是scipy.linalg.bicgstab()的返回值是tuple,而不是您期望的NumPy数组。

另一个问题是您尝试访问索引分别为(nx, ny)i, j0的{​​{1}}形状为ny的对象。因此,除非您有nx,否则上面的代码将在某个时候超出数组边界。

最后,所有这些操作都通过显式循环来完成。但是,NumPy提供了更好的工具来获取您想要的东西,特别是nx == ny

例如:

np.reshape()

向量化方法快约250倍。

答案 1 :(得分:1)

我在官方文档中闲逛了。事实证明,所有的稀疏迭代求解器都返回两件事:解和收敛信息。如果仅将其写为y = sp.linalg.bicgstab(A, b),则y成为形状(2,)的元组,其中第一个元素是解,第二个元素是会聚信息。我通过进行y, exit_code = sp.linalg.bicgstab(A, b)来修复它。现在可以正常使用