您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – 从满足条件的NumPy矩阵中的每一行中取N个第一个值

5b51 2022/1/14 8:21:35 python 字数 2996 阅读 486 来源 www.jb51.cc/python

我有一个numpy向量和一个numpy数组.我需要从矩阵中的每一行获取小于(或等于)向量中相应行的第一个N(比如3)值.所以如果这是我的载体:7, 9, 22, 38, 6, 15 这是我的矩阵:[[ 20., 9., 7., 5., None, None], [ 33., 21., 18., 9., 8., 7.],

概述

我有一个numpy向量和一个numpy数组.

我需要从矩阵中的每一行获取小于(或等于)向量中相应行的第一个N(比如3)值.

所以如果这是我的载体:

7,9,22,38,6,15

这是我的矩阵:

[[ 20.,9.,7.,5.,None,None],[ 33.,21.,18.,8.,7.],[ 31.,13.,12.,4.,0.],[ 36.,11.,2.],[ 20.,14.,10.,6.,3.],[ 14.,5.]]

输出应该是:

[[7,5,[9,8,7],[21,13,12],[36,18,11],[6,3],14,13]]

是否有任何有效的方法来做掩码或其他东西,没有丑陋的for循环?

任何帮助将不胜感激!

这是broadcasting一个

def takeN_le_per_row_broadcasting(a,b,N=3): # a,b : 1D,2D arrays respectively
    # First col indices in each row of b with <= corresponding one in a
    idx = (b <= a[:,None]).argmax(1)

    # Get all N ranged column indices
    all_idx = idx[:,None] + np.arange(N)

    # Finally advanced-index with those indices into b for desired output
    return b[np.arange(len(all_idx))[:,all_idx]

方法#2

受到NumPy Fancy Indexing - Crop different ROIs from different channels‘s solution的启发,我们可以利用np.lib.stride_tricks.as_strided进行高效的补丁提取,就像这样 –

from skimage.util.shape import view_as_windows

def takeN_le_per_row_strides(a,None]).argmax(1)

    # Get 1D sliding windows for each element off data
    w = view_as_windows(b,(1,N))[:,:,0]

    # Use fancy/advanced indexing to select the required ones
    return w[np.arange(len(idx)),idx]

总结

以上是编程之家为你收集整理的python – 从满足条件的NumPy矩阵中的每一行中取N个第一个值全部内容,希望文章能够帮你解决python – 从满足条件的NumPy矩阵中的每一行中取N个第一个值所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶