Chcę substancji z matrycy N-wymiarowej. Bez znajomości z góry wymiarowości matrycy. Tak podane:

import random

a = [10 for _ in range(0, random.randint(0,10))]
M = np.full(a, True)
# Now get the submatrix dynamically with block notation
# so something like:
# str = ["1:5" for _ in range(0, len(a))].join(",")
# N = eval("M[ " + str + "]")

Chciałbym wiedzieć o ładnym sposobie, aby wykonać tę notację, a także prędkość mądry.

(Druga odpowiedź dostarczona w Numpy Extractix nie rozwiązuje bezpośrednio pytanie, ponieważ zaakceptowana odpowiedź, używając .ix_ nie akceptuje plasterka.)

2
levilime 28 luty 2019, 16:32

2 odpowiedzi

Najlepsza odpowiedź

Możemy użyć np.s_ slice notacja pod okapami -

M[[np.s_[1:5]]*M.ndim]

To daje nam FutureWarning:

Futurewarning: Za pomocą sekwencji bez krotki dla wielowymiarowych indeksowania jest przestarzały

Aby go uniknąć, musimy owijać się z tuple(), jak tak -

M[tuple([np.s_[1:5]]*M.ndim)]

Za pomocą wyraźnego {x0}} notation byłoby -

M[tuple([slice(1,5)]*M.ndim)]
2
Divakar 28 luty 2019, 14:14

Dzięki opcji Nice Stack Przepełnienie powiązane Wyszukaj już widziałem np.ix_, Numpy Excirix, Wtedy stanie się:

N = M[np.ix_(*[range(1,5) for _ in range(0, len(a))])]
1
levilime 28 luty 2019, 15:46