В сеансе Octave:
>> a=[1 2 3;4 5 6;7 8 9]
a =
1 2 3
4 5 6
7 8 9
>> b=[1, 4, 8]
b =
1 4 8
>> a(b)
ans =
1 2 6
Это не тот тип поведения, который я помню, получая в MATLAB, но тогда у меня нет привычки использовать значения индекса, превышающие измерения.Очевидно, он выбирает элементы в сплюснутой матрице
>> reshape(a,1,9)
ans =
1 4 7 2 5 8 3 6 9
>> reshape(a,1,9)(b)
ans =
1 2 6
В Python / numpy индексация выполняется с []
вместо ()
.Он также основан на 0, а не 1.
In [56]: a = np.arange(1,10).reshape(3,3)
In [57]: a
Out[57]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
In [58]: b=[0,3,7]
In [59]: a.ravel(order='F')[b]
Out[59]: array([1, 2, 6])
In [60]: a.ravel(order='F')
Out[60]: array([1, 4, 7, 2, 5, 8, 3, 6, 9])
Чтобы получить те же значения в numpy
, мне пришлось указать order F
при выравнивании массива.Таким образом, он 'сканирует' значения в главном порядке столбцов, которые использует MATLAB.
Без order F
порядок сканирования по умолчанию - основной ряд:
In [61]: a.ravel()
Out[61]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])
In [62]: a.ravel()[b]
Out[62]: array([1, 4, 8])
Я также мог бы получитьпорядок F при первоначальном изменении формы a
:
In [67]: a = np.arange(1,10).reshape(3,3,order='F')
In [68]: a
Out[68]:
array([[1, 4, 7],
[2, 5, 8],
[3, 6, 9]])
In [69]: a.flat[b]
Out[69]: array([1, 2, 6])
===
В MATLAB / Octave мы можем получить двумерные индексы с:
>> [r,c] = ind2sub([3,3],b)
r =
1 1 2
c =
1 2 3
>> a(1,1), a(1,2), a(2,3)
ans = 1
ans = 2
ans = 6
То же самое распутывание в numpy
(применительно к заказу F версии a
):
In [75]: np.unravel_index(b, (3,3))
Out[75]: (array([0, 1, 2]), array([0, 0, 1]))
In [76]: a[_] # using the Out[75] line as index
Out[76]: array([1, 2, 6])
In [77]: a[0,0],a[1,0],a[2,1] # equivalently
Out[77]: (1, 2, 6)