我想创建一个方阵,比如说 4X4,其中的条目取自长度为 16 的向量。该向量条目将排列在矩阵的列中。假设u是长度为16的向量,M是大小为4x4的矩阵。那么,M(1,1)=u(1),M(2,1)=u(2),M(3,1)=u(3),M(4,1)=u(4), M(1,2)=u(5)、M(2,2)=u(6)、M(3,2)=u(7) 等等。
这是我写的代码:
import numpy as np
Nx = Ny = 4
u0 = np.zeros([Nx*Ny, 1])
U0 = np.zeros([Nx, Ny])
aa = 0
for j in range(Ny):
for i in range(Nx):
U0[i][j] = u0[i+aa]
if (i%Nx) == 3:
aa = aa+4
else:
aa = aa
其中 Nx=Ny=4,u0 是长度为 16 的向量。
运行代码后,结果如下:
:79:DeprecationWarning:不推荐将 ndim > 0 的数组转换为标量,并且将来会出错。确保在执行此操作之前从数组中提取单个元素。 (已弃用 NumPy 1.25。) U0[i][j]=u0[i+aa]
有人可以帮我解释这个结果吗?我的代码有什么问题吗?
虽然所需的操作可以通过像u.rehape((4,4), order='F')
一样通过
reshaping来完成,但在某些复制数据的情况下,初始方法可能是合理的。所以让我们让它发挥作用吧。
您遇到的问题源于这样一个事实:从技术上讲,您使用的不是向量,而是二维矩阵。因此,像
u0[i+aa]
这样的表达式返回的不是标量,而是包含单个项目的向量。此时它可以用作赋值中的标量,您看到的只是一个弃用警告。为了摆脱它并确保代码适用于较新的 Numpy 版本,您必须添加加法索引以获得标量,例如 u0[i+aa, 0]
。这样,代码就可以正常工作,不会出现任何警告。
我会进行您可能感兴趣的其他修复:
import numpy as np
Nx = Ny = 4
vector = np.arange(Nx*Ny).reshape(-1, 1) # get a vertical vector
matrix = np.zeros([Nx, Ny], dtype=vector.dtype) # keep dtype of the vector as far as possible
start = 0
for column in range(Ny):
matrix[:, column] = vector[start:start+Nx, 0]
start += Nx
print('vector:', vector, '\nmatrix:', matrix, sep='\n')
vector:
[[ 0]
[ 1]
[ 2]
[ 3]
[ 4]
[ 5]
[ 6]
[ 7]
[ 8]
[ 9]
[10]
[11]
[12]
[13]
[14]
[15]]
matrix:
[[ 0 4 8 12]
[ 1 5 9 13]
[ 2 6 10 14]
[ 3 7 11 15]]