在列中打印numpy具有不同位置

时间:2017-12-23 17:35:11

标签: python numpy

我有以下numpy数组

import numpy as np
np.random.seed(20)
np.random.rand(20).reshape(5, 4)

array([[ 0.5881308 ,  0.89771373,  0.89153073,  0.81583748],
       [ 0.03588959,  0.69175758,  0.37868094,  0.51851095],
       [ 0.65795147,  0.19385022,  0.2723164 ,  0.71860593],
       [ 0.78300361,  0.85032764,  0.77524489,  0.03666431],
       [ 0.11669374,  0.7512807 ,  0.23921822,  0.25480601]])

对于每一列,我想将其分割为位置:

position_for_slicing=[0, 3, 4, 4]

所以我会得到以下数组:

array([[ 0.5881308 , 0.85032764,  0.23921822,   0.81583748],
       [ 0.03588959, 0.7512807 ,  0             0],
       [ 0.65795147, 0,           0             0],
       [ 0.78300361, 0,           0             0],
       [ 0.11669374, 0,           0             0]])

有快速的方法吗?我知道我可以用来为每一列做循环,但我想知道是否有更优雅的方法来做到这一点。

1 个答案:

答案 0 :(得分:3)

如果“优雅”表示“无循环”,则以下内容符合条件,但可能不符合许多其他定义(arr是您的输入数组):

m, n = arr.shape
arrf = np.asanyarray(arr, order='F')
padded = np.r_[arrf, np.zeros_like(arrf)]
assert padded.flags['F_CONTIGUOUS']
expnd = np.lib.stride_tricks.as_strided(padded, (m, m+1, n), padded.strides[:1] + padded.strides)
expnd[:, [0,3,4,4], range(4)]
# array([[ 0.5881308 ,  0.85032764,  0.23921822,  0.25480601],
#        [ 0.03588959,  0.7512807 ,  0.        ,  0.        ],
#        [ 0.65795147,  0.        ,  0.        ,  0.        ],
#        [ 0.78300361,  0.        ,  0.        ,  0.        ],
#        [ 0.11669374,  0.        ,  0.        ,  0.        ]])

请注意,断言中的order='C''C_CONTIGUOUS'也有效。我的预感是'F'可能会更快一些,因为索引会在连续的切片上运行。