从 NumPy 矩阵中满足条件的每一行中取 N 个第一个值
Take N first values from every row in NumPy matrix that fulfill condition
我有一个numpy vector
,还有一个numpy array
。
我需要从矩阵中的每一行中取出小于(或等于)向量中相应行的前 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
受, we can leverage 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]
我有一个numpy vector
,还有一个numpy array
。
我需要从矩阵中的每一行中取出小于(或等于)向量中相应行的前 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
受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]