在列中打印不同位置的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]])

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

保罗·潘泽

如果“优雅”表示“无循环”,则将符合以下条件,但可能不符合许多其他定义(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'可能会更快一些,因为索引随后将在连续的切片上进行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章