选择性重塑3d阵列到2d阵列

时间:2017-06-06 15:51:49

标签: arrays python-2.7 numpy reshape

我正在使用3d矢量数组,并且无法正确地重塑。 我的尺寸对应于如下数量:

0 =向量(3)

1 =第(4)点

2 =折线(2)

因此,这可以解释为2条折线,每条折线包含4个点,每个点都有一个矢量。我想重塑一个2d矩阵,即(3,8)。

原始数组是:

poly_array = array([[[-0.707, 0.0],
                      [-0.371, 0.0],
                      [0.371, 0.0],
                      [0.707, 0.0]],
                     [[0.0, -0.707],
                      [0.0, 0.0],
                      [0.0, 0.707],
                      [0.0, 0.0]],
                     [[0.707, 0.707],
                      [0.928, 1.0],
                      [0.928, 0.707],
                      [0.707, 0.0]]])

所以,如果我在第一条折线上查看有序点,我会运行:

for i in range(4):
    print poly_array[:,i,0]

或沿第二条折线的有序点:

for i in range(4):
    print poly_array[:,i,1]

如果我重塑这种方式:

new_dim = shape(poly_array)[1] * shape(poly_array)[2]
new_array = poly_array.reshape(3, new_dim)

但是这会将向量排序为从每条折线中取一个(即pt0-polyline0,pt0-polyline1,pt1-polyline0,pt1-polyline1等)

In: print new_array[:, 0]
Out: [-0.707  0.     0.707]

In: print new_array[:, 1]
Out: [ 0.    -0.707  0.707]

但我想要

In: print new_array[:, 1]
Out: [-0.371  0.     0.928]

如何重新整形以便在下一条折线之前循环通过对应于给定折线的点(沿轴1)的所有矢量?

1 个答案:

答案 0 :(得分:0)

您需要使用np.swapaxes和重塑 -

对轴进行一些置换
poly_array.swapaxes(1,2).reshape(poly_array.shape[0],-1)

示例运行 -

In [127]: poly_array
Out[127]: 
array([[[-0.707,  0.   ],
        [-0.371,  0.   ],
        [ 0.371,  0.   ],
        [ 0.707,  0.   ]],

       [[ 0.   , -0.707],
        [ 0.   ,  0.   ],
        [ 0.   ,  0.707],
        [ 0.   ,  0.   ]],

       [[ 0.707,  0.707],
        [ 0.928,  1.   ],
        [ 0.928,  0.707],
        [ 0.707,  0.   ]]])

In [142]: out
Out[142]: 
array([[-0.707, -0.371,  0.371,  0.707,  0.   ,  0.   ,  0.   ,  0.   ],
       [ 0.   ,  0.   ,  0.   ,  0.   , -0.707,  0.   ,  0.707,  0.   ],
       [ 0.707,  0.928,  0.928,  0.707,  0.707,  1.   ,  0.707,  0.   ]])

In [143]: out[:,1]
Out[143]: array([-0.371,  0.   ,  0.928])