Numpy切换特定的列部分,在另一列中具有相同的部分

时间:2014-02-27 20:04:11

标签: python numpy

我有一个数组A:

>>> A=np.array([[1,2,3],
                [1,3,0],
                [2,0,0]])

我想要:

>>> B
     array([[ 1.,  0.,  0.],
            [ 2.,  0.,  0.],
            [ 3.,  0.,  0.],
            [ 0.,  1.,  0.],
            [ 0.,  3.,  0.],
            [ 0.,  0.,  0.],
            [ 0.,  0.,  2.],
            [ 0.,  0.,  0.],
            [ 0.,  0.,  0.]])

我目前正在执行此操作:

>>> rows,cols=A.shape

>>> C=np.zeros([rows*cols,cols])

>>> C[:,0]=np.ravel(A)

>>> for i in range(1,C.shape[1]):
...     C[i*rows:(i+1)*rows,[i,0]]=C[i*rows:(i+1)*rows,[0,i]]

有没有办法在没有循环的情况下进行这种转换?

2 个答案:

答案 0 :(得分:1)

>>> rows, cols = A.shape
>>> row_idx = np.arange(rows*cols)
>>> col_idx = np.repeat(np.arange(rows), cols)
>>> B = np.zeros((rows*cols, rows), dtype=A.dtype)
>>> B[row_idx, col_idx] = A.ravel()
>>> B
array([[1, 0, 0],
       [2, 0, 0],
       [3, 0, 0],
       [0, 1, 0],
       [0, 3, 0],
       [0, 0, 0],
       [0, 0, 2],
       [0, 0, 0],
       [0, 0, 0]])

答案 1 :(得分:0)

rows = A.shape[0]
C = np.zeros((A.size, rows))
ind = np.arange(0, C.size, rows).reshape(A.shape) + np.arange(rows)[:,None]
C.flat[ind] = A