python - 将 3D 矩阵转换/整形为 2D 矩阵

标签 python numpy matrix

我有一个 3D 矩阵 X,其中包含向量作为第 3 维的行。我想提取每个这样的向量 X(:, x, y) 并将其保存为二维矩阵,这样 X(:, 0, 0) 是第一个二维矩阵的行,X(:, 0, 1) 第二行,依此类推。以下粗略的图形可能有助于说明这一点:

Crude Sketch

我知道我可以创建新的 2D 矩阵,然后遍历原始 X 以添加向量,但是有人对如何快速有效地执行此操作有一些意见吗?


例子:给定

>>> a = np.arange(9*3).reshape(3,3,3)
>>> a
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])

我想获取以下行,但行的顺序无关紧要:

array([[ 0,  9, 18],
       [ 1, 10, 19]],
       ...)

最佳答案

使用np.transpose然后 reshape像这样 -

X.transpose(1,2,0).reshape(-1,X.shape[0])

解释-

1) 你想要得到由 X[:, 0, 0], X[:, 0, 1] 等组成的行,即我们必须将 axis=0 元素“推”到此类二维数组输出的最后一个轴。接下来,我们必须确定行的顺序,这将由 axes=1,2 组成。现在,回到所需的二维数组输出,在第一行和第二行之间,即在 X[:, 0, 0]X[:, 0, 1] 之间>, axis=1 保持不变。因此,在二维数组输出中,第二个轴 (axis=1) 将优先于第三个轴 (axis=2)。因此,在 X 中,我们将 axis=1 推到 axis=0 并将 axis=2 推到 axis =1。因为,如前所述,X 中的 axis=0 必须移动到最后一个轴,所以那将是 axis=2。所有这些都可以用 X.transpose(1,2,0) 来完成。我们称它为 Y

2) 最后,我们必须将 Y reshape 为 2D 数组,使每行中的元素数与 X.shape[0 ],这是通过Y.reshape(-1,X.shape[0])实现的。于是,最终的解决方案就变成了——

X.transpose(1,2,0).reshape(-1,X.shape[0])

sample 运行-

In [25]: X
Out[25]: 
array([[[ 0.19508052,  0.02481975],
        [ 0.88915956,  0.95974095]],

       [[ 0.23271151,  0.14730822],
        [ 0.56763563,  0.30607283]],

       [[ 0.33259228,  0.42552102],
        [ 0.28950926,  0.47782175]]])

In [26]: X[:, 0, 0]
Out[26]: array([ 0.19508052,  0.23271151,  0.33259228])

In [27]: X[:, 0, 1]
Out[27]: array([ 0.02481975,  0.14730822,  0.42552102])

In [28]: X[:, 1, 0]
Out[28]: array([ 0.88915956,  0.56763563,  0.28950926])

In [29]: X[:, 1, 1]
Out[29]: array([ 0.95974095,  0.30607283,  0.47782175])

In [30]: X.transpose(1,2,0).reshape(-1,X.shape[0])
Out[30]: 
array([[ 0.19508052,  0.23271151,  0.33259228],
       [ 0.02481975,  0.14730822,  0.42552102],
       [ 0.88915956,  0.56763563,  0.28950926],
       [ 0.95974095,  0.30607283,  0.47782175]])

关于python - 将 3D 矩阵转换/整形为 2D 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35992458/

相关文章:

python - AttributeError: 'int' 对象没有属性 'insert'

python - 使用python在sqlite select查询中动态搜索null

python - 无法解决为什么在 __init__ 上出现类型错误

python - 在 Python (Pandas/Numpy) 中,如何使用条件和特定 block 大小对 df 进行子集化?

performance - 寻找使用 MATLAB 计算矩阵的更快方法

python - 为什么我的列表没有按照预期的方式改变?

python - 在 Python 中使用 rsync 与变量串联时出错

python - NumPy 相位因子,(-1)^n : performance

python - 针对 NumPy dtypes 的验证——检查值最不迂回的方法是什么?

r - 将 "table"类的对象转换为 R 中的矩阵