Można użyć np.ix_
dla takiego broadcasted indexing
, jak tak -
X[np.ix_(a,b)]
Choć to nie będzie krótsza niż oryginalnego kodu, ale miejmy nadzieję, powinno być szybsze. Dzieje się tak dlatego, że unikamy wyjścia pośredniego, tak jak z oryginalnym kodem, który utworzył X[a,:]
z jednym cięciem, a następnie kolejnym cięciem X[a,:][:,b]
, aby dać nam ostateczny wynik.
Ta metoda działałaby również dla a
i b
zarówno jako tablice int
, jak i boolean
.
Przykładowy przebieg
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]])
testu Czas trwania
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
Nie, to jest matryca 2D. – off99555
Czy używasz macierzy NumPy lub NumPy? – Divakar