Python 每行Numpy动态切片

Python 每行Numpy动态切片,python,numpy,dynamic,slice,Python,Numpy,Dynamic,Slice,如何在给定起始索引和结束索引的情况下动态切片每一行,而不使用for循环。我可以使用下面列出的循环来完成,但是对于x.shape[0]>1磨机的情况来说,它太慢了 x= np.arange(0,100) x = x.reshape(20,5) s_idx = np.random.randint(0,3,x.shape[0]) e_idx = np.random.randint(3,6,x.shape[0]) print(s_idx) >>> array([2, 1, 2,

如何在给定起始索引和结束索引的情况下动态切片每一行,而不使用for循环。我可以使用下面列出的循环来完成,但是对于x.shape[0]>1磨机的情况来说,它太慢了

x= np.arange(0,100)   
x = x.reshape(20,5)
s_idx = np.random.randint(0,3,x.shape[0])
e_idx = np.random.randint(3,6,x.shape[0])

print(s_idx)
>>> array([2, 1, 2, ..., 1, 0, 2])  

print(e_idx)
>>> array([3, 4, 5, ..., 3, 3, 3]) 

print(x)
>>> array([[ 0,  1,  2,  3,  4],
[ 5,  6,  7,  8,  9], 
[10, 11, 12, 13, 14], 
...,   
[85, 86, 87, 88, 89], 
[90, 91, 92, 93, 94], 
[95, 96, 97, 98, 99]])   

x_indexed = []
for idx,value in enumerate(s_idx):   
    x_indexed.append(x[idx][s_idx[idx]:e_idx[idx]])

print(x_indexed)
>>> [array([2]),
     array([6, 7, 8]),
     array([12, 13, 14]),
     array([15, 16, 17]),
     array([20, 21, 22, 23]),
     array([26, 27, 28, 29]),
     array([30, 31, 32, 33]),
     array([35, 36, 37, 38, 39]),
     array([40, 41, 42]),
     array([46, 47, 48]),
     array([52, 53, 54]),
     array([56, 57]),
     array([62, 63, 64]),
     array([67]),
     array([70, 71, 72, 73]),
     array([77]),
     array([80, 81, 82, 83, 84]),
     array([86, 87]),
     array([90, 91, 92]),
     array([97])]
您可以使用:

可以使用屏蔽数组执行大多数NumPy操作,但如果仍然需要数组列表,可以执行以下操作:

list_arrays = [row[~m] for row, m in zip(x, x_masked.mask)]
print(list_arrays)
输出:

[[0 1 2 3 --]
 [5 6 7 8 9]
 [10 11 12 13 14]
 [-- -- 17 -- --]
 [-- -- 22 -- --]
 [25 26 27 28 --]
 [-- -- 32 33 --]
 [-- 36 37 38 --]
 [-- -- 42 -- --]
 [-- -- 47 -- --]
 [-- -- 52 53 --]
 [-- -- 57 58 --]
 [-- 61 62 63 --]
 [65 66 67 68 69]
 [70 71 72 -- --]
 [75 76 77 78 79]
 [80 81 82 83 --]
 [-- -- 87 88 --]
 [90 91 92 93 94]
 [-- 96 97 98 99]]
[array([0, 1, 2, 3]),
 array([5, 6, 7, 8, 9]),
 array([10, 11, 12, 13, 14]),
 array([17]),
 array([22]),
 array([25, 26, 27, 28]),
 array([32, 33]),
 array([36, 37, 38]),
 array([42]),
 array([47]),
 array([52, 53]),
 array([57, 58]),
 array([61, 62, 63]),
 array([65, 66, 67, 68, 69]),
 array([70, 71, 72]),
 array([75, 76, 77, 78, 79]),
 array([80, 81, 82, 83]),
 array([87, 88]),
 array([90, 91, 92, 93, 94]),
 array([96, 97, 98, 99])]

虽然在这种情况下,您显然不需要构造中间屏蔽数组,但您可以只遍历
x
mask

的行,结果是一个列表,对吗?具有不同长度的元素?清理索引表达式的方法有很多,但基本上这是一项迭代任务。更改为
x_index.append(x[idx,s_idx[idx]:e_idx[idx]]
,将
s_idx
e_dix
转换为列表可能会有所帮助。我不知道如何在没有循环的情况下做到这一点。它不必是一个列表。我只需要在不使用循环的情况下完成它。这正好回答了我的问题。我从来都不知道蒙面阵列。
[array([0, 1, 2, 3]),
 array([5, 6, 7, 8, 9]),
 array([10, 11, 12, 13, 14]),
 array([17]),
 array([22]),
 array([25, 26, 27, 28]),
 array([32, 33]),
 array([36, 37, 38]),
 array([42]),
 array([47]),
 array([52, 53]),
 array([57, 58]),
 array([61, 62, 63]),
 array([65, 66, 67, 68, 69]),
 array([70, 71, 72]),
 array([75, 76, 77, 78, 79]),
 array([80, 81, 82, 83]),
 array([87, 88]),
 array([90, 91, 92, 93, 94]),
 array([96, 97, 98, 99])]