Potreste usare np.ix_
per tale broadcasted indexing
, in questo modo -
X[np.ix_(a,b)]
Anche se questo non ci sarà alcun più corto del codice originale, ma si spera che dovrebbe essere più veloce. Questo perché stiamo evitando l'output intermedio come con il codice originale che ha creato X[a,:]
con un'affettazione e quindi un altro slicing X[a,:][:,b]
per darci l'output finale.
Inoltre, questo metodo dovrebbe funzionare per a
e b
sia come int
e boolean
array.
Esempio corsa
In [141]: X = np.random.randint(0,99,(6,5))
In [142]: m,n = X.shape
In [143]: a = np.in1d(np.arange(m),np.random.randint(0,m,(m)))
In [144]: b = np.in1d(np.arange(n),np.random.randint(0,n,(n)))
In [145]: X[a,:][:,b]
Out[145]:
array([[17, 81, 64],
[87, 16, 54],
[98, 22, 11],
[26, 54, 64]])
In [146]: X[np.ix_(a,b)]
Out[146]:
array([[17, 81, 64],
[87, 16, 54],
[98, 22, 11],
[26, 54, 64]])
prova Runtime
In [147]: X = np.random.randint(0,99,(600,500))
In [148]: m,n = X.shape
In [149]: a = np.in1d(np.arange(m),np.random.randint(0,m,(m)))
In [150]: b = np.in1d(np.arange(n),np.random.randint(0,n,(n)))
In [151]: %timeit X[a,:][:,b]
1000 loops, best of 3: 1.74 ms per loop
In [152]: %timeit X[np.ix_(a,b)]
1000 loops, best of 3: 1.24 ms per loop
.... 'X [a,:, b]'? – Divakar
No, questa è una matrice 2D. – off99555
Stai lavorando con gli array NumPy o le matrici NumPy? – Divakar