我有一个数组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]]
有没有办法在没有循环的情况下进行这种转换?
答案 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