Получение элементов из простой матрицы, индексы которой находятся в массиве - PullRequest
2 голосов
/ 22 мая 2019

Я пытаюсь преобразовать код Matlab в Python, и я столкнулся с кодом вроде:

a=[1 2 3;4 5 6;7 8 9]
b=[1, 4, 8]
a(b)
//output :
ans :
1   4   8

это на самом деле получение индексов от b и делает

a.item(x) #python

все, что я 'Я пытаюсь спросить, есть ли способ сделать это в Python?Благодарю.:)

Ответы [ 3 ]

2 голосов
/ 22 мая 2019

Внимание: на момент написания этого ответа приведенный в вопросе пример неверен.a(b) приведет к:

ans =
   1   2   6

В предоставленном коде MATLAB используется линейное индексирование , в котором используется порядок по главному столбцу, тогда как заявленная функция a.item(x) Python использует порядок по главному ряду..

Функция ind2sub MATLAB может преобразовывать линейные индексы в индексы массива.Аналогичная функция numpy имеет вид unravel_index.

Давайте посмотрим на следующий пример кода.Внимание: Python использует индексацию на основе 0, тогда как MATLAB использует индексацию на основе 1.

import numpy as np

a = np.array([[10, 20, 30], [40, 50, 60], [70, 80, 90]])
b = np.array([0, 3, 7])

c = a[np.unravel_index(b, a.shape, 'F')]

print(a)
print(b)
print(c)

[[10 20 30]
 [40 50 60]
 [70 80 90]]

[0 3 7]

[10 20 60]
1 голос
/ 22 мая 2019

Использовать NumPy

  • Сначала выровняйте массив 2D в 1D
  • Затем используйте индекс в b, чтобы найти данные в a
  • Примечание: индекс в python начинается с 0 matlab, это 1, поэтому вам нужно уменьшить показатели в б на 1
    import numpy as np

    a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    a = a.flatten()
    b = np.array([1, 4, 8])

    print(a[b-1])

    #array([1, 4, 8])

0 голосов
/ 22 мая 2019

В сеансе 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...