如何对NumPy矩阵数组中的每个矩阵应用np.hstack函数?
解决numpy三维数组中每个矩阵横向拼接的问题
嘿,我完全get你的需求——把三维数组里的每个二维子矩阵的行横向拼接起来,得到一个2行6列的结果对吧?其实不用纠结np.apply_along_axis,numpy里有更简单直接的办法,给你两种方案:
方案一:列表推导式 + np.hstack
这个方法直观易懂,适合新手理解:
import numpy as np matrices_w = np.asarray([[[1,2,3],[4,5,6]],[[9,8,7],[6,5,4]]]) # 遍历每个子矩阵,对每个矩阵执行横向拼接 result = np.array([np.hstack(mat) for mat in matrices_w]) print(result) # 输出: # array([[1, 2, 3, 4, 5, 6], # [9, 8, 7, 6, 5, 4]])
原理很简单:我们遍历三维数组的第一个维度(也就是每个子矩阵),对每个2x3的子矩阵用np.hstack把两行拼合成一行,最后再用np.array把这些拼接后的行组合成最终的二维数组。
方案二:用reshape直接调整维度(更高效)
如果你的数据量比较大,推荐用这个方法,因为它是numpy底层的维度变换,没有循环开销:
import numpy as np matrices_w = np.asarray([[[1,2,3],[4,5,6]],[[9,8,7],[6,5,4]]]) # 把每个子矩阵的元素摊平成一行,-1让numpy自动计算列数 result = matrices_w.reshape(matrices_w.shape[0], -1) print(result)
这里matrices_w.shape是(2,2,3),reshape(2, -1)会自动把后面两个维度(2和3)合并成2*3=6,直接得到(2,6)的数组,效果和hstack完全一致,但速度快很多。
至于你之前用np.apply_along_axis没成功,是因为这个函数会沿着指定轴把元素展平后再传进函数,不太适配这种“对每个子矩阵整体操作”的场景,所以上面两种方法更合适~
内容的提问来源于stack exchange,提问作者St123
相关产品推荐
相关产品推荐

