Есть ли у NumPy обратное значение unravel_index ()? - PullRequest
11 голосов
/ 06 ноября 2010

numpy.unravel_index () принимает форму и плоский индекс в массиве и возвращает кортеж, который представляет этот индекс в массиве. Есть ли обратное? Я могу вычислить его вручную, но похоже, что это где-то встроенная функция ...

Ответы [ 4 ]

8 голосов
/ 30 сентября 2014

Начиная с numpy 1.6.0 (май 2011 г.) имеется встроенная функция NumPy ravel_multi_index

Преобразует массив индексов в массив плоских индексов,применение граничных режимов к мультииндексу.

(Это также упоминается в комментарии пользователя Би Рико, но должно действительно отображаться в качестве ответа)

3 голосов
/ 24 ноября 2010

Это работает:

def ravel_index(pos, shape):
    res = 0
    acc = 1
    for pi, si in zip(reversed(pos), reversed(shape)):
        res += pi * acc
        acc *= si
    return res
2 голосов
/ 06 ноября 2010

Ответ лежит в numpy.ndarray.strides. Смотри http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.strides.html

1 голос
/ 19 марта 2012

Это не встроенная команда, но я всегда использовал следующий фрагмент, предполагая, что используется индексирование по строкам по умолчанию для numpy:

np.sum(np.array(index_tuple[:-1])*np.array(a_matrix.shape[1:]))+np.array(index_tuple[-1])

для индексации по типу Фортана (по столбцам)просто нужно поменять местами индексы:

np.sum(np.array(index_tuple[1:])*np.array(a_matrix.shape[:-1]))+np.array(index_tuple[0])

В приведенном выше примере index_tuple и a_matrix - это кортеж, содержащий интересующие индексы и индексируемую матрицу соответственно.Это не имеет вышеупомянутой проблемы, связанной с шагами, когда ломтики взяты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...