Octave (или Matlab) функция sub2ind преобразуется в код python [duplicate]

Ответ будет отрицательным, ваши попытки действий на сервере не будут выполнены через 30 секунд, ваш объект SqlCommand выдаст исключение в ваш код (ниже), а транзакция неявной хранимой процедуры будет отката.

Истекло время ожидания , Период времени ожидания истекает до завершения операции или сервер не отвечает.

... по крайней мере, это поведение, которое я могу проверить с помощью SQL Server ...

14
задан Framester 5 March 2013 в 19:22
поделиться

2 ответа

Я думаю, вы хотите использовать np.ravel_multi_index . При индексировании с нулевым индексом numpy и принимая во внимание, что массивы Matlab являются стилями Fortran, эквивалент вашему примеру в Matlab:

>>> np.ravel_multi_index((1, 0, 1), dims=(3, 4, 2), order='F')
13

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

>>> a = np.random.rand(3, 4, 2)
>>> np.dot((1, 0, 1), a.strides) / a.itemsize
9.0
>>> np.ravel_multi_index((1, 0, 1), dims=(3, 4, 2), order='C')
9
>>> a[1, 0, 1]
0.26735433071594039
>>> a.ravel()[9]
0.26735433071594039
21
ответ дан Jaime 16 August 2018 в 01:44
поделиться
  • 1
    Это немного вводит в заблуждение. Это делает его похожим на то, что вам нужно знать макет памяти массива, чтобы использовать плоскую индексацию, что неверно. Метод strides будет работать только с массивами C-Contiguous, тогда как это всегда будет верно: A[idx] == A.flat[flat_idx] == A.ravel()[flat_idx], если flat_idx = np.ravel_multi_index(idx, A.shape). Приятно отметить, что flat_idx вычисляются по-разному в matlab и numpy. – Bi Rico 6 March 2013 в 01:01

Вот как я решил проблему для меня, переписанную так же, как приведенный выше пример.

Основная идея заключается в создании вспомогательного массива с индексами с использованием arange и reshape.

In [1]: import numpy as np

In [2]: A = np.random.rand(3,4,2)

In [3]: A
Out[3]: 
array([[[ 0.79341698,  0.55131024],
        [ 0.29294586,  0.22209375],
        [ 0.11514749,  0.15150307],
        [ 0.71399288,  0.11229617]],

       [[ 0.74384776,  0.96777714],
        [ 0.1122338 ,  0.23915265],
        [ 0.28324322,  0.7536933 ],
        [ 0.29788946,  0.54770654]],

       [[ 0.13496253,  0.24959013],
        [ 0.36350264,  0.00438861],
        [ 0.77178808,  0.66411135],
        [ 0.26756112,  0.54042292]]])

In [4]: helper = np.arange(3*4*2)

In [5]: helper
Out[5]: 
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23])

In [6]: helper = helper.reshape([3,4,2])

In [7]: helper
Out[7]: 
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5],
        [ 6,  7]],

       [[ 8,  9],
        [10, 11],
        [12, 13],
        [14, 15]],

       [[16, 17],
        [18, 19],
        [20, 21],
        [22, 23]]])

In [8]: linear_index = helper[1,0,1]

In [9]: linear_index
Out[9]: 9

Обратите внимание, что:

  • строки и столбцы переключаются в Numpy относительно Matlab.
  • Matlab начинает индексы с 1, Python и Numpy с 0.
1
ответ дан Framester 16 August 2018 в 01:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: