我有一个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循环?
任何帮助将不胜感激!
最佳答案
方法#1
原文链接:https://www.f2er.com/python/438835.html这是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]