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

问题描述 投票:1回答:1

我有跟随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]])

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

python numpy
1个回答
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'可能会更快一些,因为索引然后在连续的切片上运行。

© www.soinside.com 2019 - 2024. All rights reserved.