Numpy:如何拼接数组并保持dtype一致、展开嵌套数组
解决numpy数组堆叠后出现嵌套的问题
嘿,我来帮你搞定这个嵌套数组的麻烦!你的问题出在两个地方:一是你把部分待拼接的元素打包成了嵌套列表,二是np.vstack(a)生成了二维数组,直接拼接会导致结构嵌套。咱们一步步来修正:
问题根源
你当前的代码里,np.hstack((s, [np.vstack(a).astype(np.float), r, d], s_))把[np.vstack(a)...]作为一个整体传递给hstack,而且np.vstack(a)输出的是二维数组(比如形状为(n,1)),这就导致拼接后的结果里出现了嵌套的子数组结构。
解决方案:先拉平所有数组,再拼接
核心思路是把每个待拼接的部分都转换成一维float数组,然后再用np.hstack或np.concatenate完成拼接。
具体代码实现
import numpy as np # 1. 将每个待拼接元素转换为一维float数组 s_flat = s.astype(np.float).ravel() # 确保s是一维并转为float a_flat = np.vstack(a).astype(np.float).ravel() # 把vstack生成的二维数组拉平 r_flat = np.array(r).astype(np.float).ravel() # 如果r不是numpy数组,先转成数组再处理 d_flat = np.array(d).astype(np.float).ravel() s__flat = s_.astype(np.float).ravel() # 2. 拼接成平滑的一维数组 transition = np.hstack((s_flat, a_flat, r_flat, d_flat, s__flat))
更简洁的写法
如果a本身就是多个一维数组的集合,其实可以跳过vstack,直接用np.concatenate来合并a里的元素,效率更高:
transition = np.concatenate([ s.astype(np.float).ravel(), np.concatenate(a).astype(np.float), # 直接合并a中的一维数组 np.array(r).astype(np.float).ravel(), np.array(d).astype(np.float).ravel(), s_.astype(np.float).ravel() ])
验证结果
拼接完成后,你可以用print(transition.shape)来检查,结果应该是(总元素个数,),输出的数组就是像[1502.0 1469.0 ... 1541.0463344821703]这样完全平滑的一维float数组啦!
内容的提问来源于stack exchange,提问作者ahmed osama
相关产品推荐
相关产品推荐

