从向量条目创建矩阵和 NumPy 的弃用警告

问题描述 投票:0回答:1

我想创建一个方阵,比如说 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]

有人可以帮我解释这个结果吗?我的代码有什么问题吗?

python numpy matrix vector deprecation-warning
1个回答
0
投票

虽然所需的操作可以通过像u.rehape((4,4), order='F')一样通过

reshaping
来完成,但在某些复制数据的情况下,初始方法可能是合理的。所以让我们让它发挥作用吧。

您遇到的问题源于这样一个事实:从技术上讲,您使用的不是向量,而是二维矩阵。因此,像

u0[i+aa]
这样的表达式返回的不是标量,而是包含单个项目的向量。此时它可以用作赋值中的标量,您看到的只是一个弃用警告。为了摆脱它并确保代码适用于较新的 Numpy 版本,您必须添加加法索引以获得标量,例如
u0[i+aa, 0]
。这样,代码就可以正常工作,不会出现任何警告。

我会进行您可能感兴趣的其他修复:

  • 确保数据类型相同;
  • 删除不必要的作业;
  • 使用索引元组寻址单元格,而不是链式索引;
  • 使用切片将迭代推向更深入的 Numpy。
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]]
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.