gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:19:17 25 4
gpt4 key购买 nike

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

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

如果这是我的向量:

7,
9,
22,
38,
6,
15

这是我的矩阵:

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

输出应该是:

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

有没有什么有效的方法可以使用掩码之类的东西来做到这一点,而不需要丑陋的 for 循环?

任何帮助将不胜感激!

最佳答案

方法 #1

这是一个 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))[:,None], 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, 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 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 个第一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48380129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com