如何初始化空NumPy数组并添加一维数组生成二维矩阵?
如何用Numpy逐步构建二维矩阵
问题描述
想要创建一个空数组,逐步添加其他数组生成二维矩阵,尝试了以下代码:
import numpy as np arr = np.array([]) arr = np.append(arr, [1, 2]) arr = np.append(arr, [3, 4])
得到一维数组:
array([1., 2., 3., 4.])
期望得到二维数组:
array([[1., 2.], [3., 4.]])
尝试初始化多维数组arr = np.array([[]])并使用concatenate:
arr = np.concatenate((arr, [1, 2]), axis=0)
仍得到一维数组,求修正方法。
解决方案
方法1:保持二维结构的append操作
初始化时创建指定列数的二维空数组,每次添加的子数组要包裹成二维形式,同时指定axis=0(按行添加):
import numpy as np # 初始化一个0行2列的二维空数组,和目标子数组列数一致 arr = np.empty((0, 2)) # 每次添加的子数组要转成二维(用[[...]]包裹) arr = np.append(arr, [[1, 2]], axis=0) arr = np.append(arr, [[3, 4]], axis=0) print(arr) # 输出: # [[1. 2.] # [3. 4.]]
如果用np.array([[]])初始化,第一次添加时必须保证维度匹配,否则会被扁平化:
arr = np.array([[]]) # 把[1,2]转成二维后再拼接 arr = np.append(arr, [[1, 2]], axis=0) arr = np.append(arr, [[3, 4]], axis=0)
方法2:使用concatenate构建二维数组
和append同理,必须保证拼接的两个数组维度一致,添加的子数组要转成二维:
arr = np.empty((0, 2)) arr = np.concatenate([arr, [[1, 2]]], axis=0) arr = np.concatenate([arr, [[3, 4]]], axis=0) print(arr)
方法3:先收集列表再转Numpy数组(推荐)
Numpy数组每次拼接都会重新分配内存,数据量大时效率较低,更推荐先通过Python列表收集子数组,最后转成二维Numpy数组:
temp = [] temp.append([1, 2]) temp.append([3, 4]) arr = np.array(temp) print(arr)
为什么之前的方法失败?
- 用
np.array([])初始化的是一维空数组,np.append默认会扁平化所有输入,最终结果还是一维。 - 用
np.array([[]])但拼接[1,2]时,[1,2]是一维数组,和二维的初始数组维度不匹配,concatenate会自动扁平化(或报错,取决于Numpy版本),导致结果仍是一维。
内容的提问来源于stack exchange,提问作者kinayrp
相关产品推荐
相关产品推荐

