如何在Python NumPy二维数组中存储一维列表作为元素?
解决numpy数组赋值列表报错的问题
你用np.zeros((N,N))创建的是float类型的二维数组,每个元素位置只能存储单个数值,没法直接放列表,所以赋值[x[i],y[j]]时会触发类型不匹配的错误。下面给两种可行的解决方法:
方案1:创建三维numpy数组(推荐)
如果不需要严格的Python列表,只是需要每个位置存储两个数值,直接把数组形状设为(N, N, 2),这样每个temp[i,j]就是长度为2的numpy子数组,完全符合需求,而且numpy的数组操作更高效:
import numpy as np N = 3 x = np.linspace(0,10,N) y = np.linspace(0,10,N) # 创建形状为(N,N,2)的三维数组,初始值为0 temp = np.zeros((N, N, 2)) # 循环赋值方式 for i in range(N): for j in range(N): temp[i, j] = [x[i], y[j]] # 更高效的无循环方式(推荐) temp = np.stack(np.meshgrid(x, y, indexing='ij'), axis=-1)
np.meshgrid会生成x和y的网格矩阵,再用np.stack在最后一维合并,直接得到目标数组,比循环效率高很多。
方案2:创建object类型的数组(存储Python列表)
如果必须让每个元素是Python列表,需要创建dtype为object的数组,这样每个位置可以存放任意Python对象:
import numpy as np N = 3 x = np.linspace(0,10,N) y = np.linspace(0,10,N) # 创建object类型的二维数组 temp = np.empty((N, N), dtype=object) for i in range(N): for j in range(N): temp[i, j] = [x[i], y[j]]
注意:这种方式会失去numpy数组的数值计算优势,因为每个元素是Python对象,操作效率较低,除非有特殊需求,不建议使用。
内容的提问来源于stack exchange,提问作者Miłosz Wiśniewski
相关产品推荐
相关产品推荐

