Динамически получить подматрицу с нотацией блоков (срезов) - PullRequest
0 голосов
/ 28 февраля 2019

Я хочу подматрицу из n-мерной матрицы.Не зная заранее размерности матрицы.Итак, учитывая:

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 + "]")

Я хотел бы узнать о хорошем способе сделать это обозначение мудрым, а также по скорости.

(Другой ответ предоставлен в Подматрица Numpy extract не решает вопрос напрямую, потому что принятый ответ с использованием .ix_ не принимает срез.)

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Мы можем использовать np.s_, который использует обозначения slice под капотами -

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

Это дает нам FutureWarning:

FutureWarning: Использование последовательности без кортежей для многомерной индексации устарело

Чтобы избежать этого, нам нужно обернуть с помощью tuple(), вот так -

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

Использованиеявная запись slice, это будет -

M[tuple([slice(1,5)]*M.ndim)]
0 голосов
/ 28 февраля 2019

С опцией поиска, связанной с переполнением стека, я уже видел np.ix_, подматрица Numpy extract , тогда она станет:

N = M[np.ix_(*[range(1,5) for _ in range(0, len(a))])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...