如何在Numpy数组中插入数据并保留其原有形状?
问题描述
我有若干固定形状的数据集合,需要将这些值存储到一个数组中,仅新增一个维度以保留其初始形状。示例代码如下:
import numpy as np arr = np.array([0,1,2]) values = np.array([[3,4,5], [6,7,8], [9,10,11]]) n = 3 for i in range(n): arr = np.append(arr, values[n])
期望输出:
>>> array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
实际得到的输出:
>>> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
请问有没有合适的函数可以解决这个问题?
解决方案
问题根源
你用np.append时,默认会把输入数组扁平化后再拼接,所以最终得到一维数组。另外你的循环里还有个错误:values[n]会触发索引越界(values只有3个元素,索引范围是0-2),应该写成values[i]。
推荐方法
1. 用np.vstack垂直拼接
先把初始的一维数组arr扩展成二维(新增一个维度),再和values垂直堆叠:
import numpy as np arr = np.array([0,1,2]) values = np.array([[3,4,5], [6,7,8], [9,10,11]]) # 将arr从(3,)转换为(1,3)的二维数组 arr_2d = arr[np.newaxis, :] # 垂直拼接两个二维数组 result = np.vstack([arr_2d, values]) print(result)
输出结果:
[[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]]
2. 用np.concatenate指定轴拼接
和上面思路一致,先扩展arr的维度,再通过指定轴来拼接:
arr_2d = np.expand_dims(arr, axis=0) result = np.concatenate([arr_2d, values], axis=0)
效果和np.vstack完全相同。
3. 避免循环拼接
绝对不要用循环一次次调用np.append——numpy数组是固定内存大小的,每次append都会创建新数组并复制数据,数据量越大效率越低。直接用上面的批量拼接方法才是正确姿势。
内容的提问来源于stack exchange,提问作者Bruno Augusto Veloso
相关产品推荐
相关产品推荐

