2015-10-09 2 views
1

Если у меня есть 2d массив, такие какКак выбрать конкретные строки и столбцы в 2d массив

A = np.arange(16).reshape(4,4) 

Как я могу выбрать row = [0, 2] и column = [0, 2] с помощью параметров? В MATLAB я могу просто сделать A[row, column], но в python это выберет 2 элемента, соответствующих (0,0) и (2,2).

В любом случае, я могу сделать это, используя некоторые параметры, как в MATLAB? Выход должен быть как [0 2

8 10]

+0

Что вы ожидаемый результат? –

+0

Я хочу выбрать строку = [1,3,5] и column = [1,3,5] от A – Matthew

+1

Да, но как это выглядит? Люди, которые знают Python, но не MATLAB, могут помочь вам, если вы предоставите более подробную информацию. –

ответ

1

Чтобы выбрать блок элементов - как это делает MATLAB, то первый индекс должен быть вектор-столбец. Есть несколько способов сделать это:

In [19]: A = np.arange(16).reshape(4,4) 
In [20]: row=[0,2];column=[0,2] 

In [21]: A[np.ix_(row,column)] 
Out[21]: 
array([[ 0, 2], 
     [ 8, 10]]) 
In [22]: np.ix_(row,column) 
Out[22]: 
(array([[0], 
     [2]]), array([[0, 2]])) 

In [23]: A[[[0],[2]],[0,2]] 
Out[23]: 
array([[ 0, 2], 
     [ 8, 10]]) 

Другой ответ использует meshgrid. Вероятно, мы могли бы перечислить полдюжины вариаций.

Хорошая документация в этом разделе: http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#purely-integer-array-indexing

+0

Согласовано множество способов! Также «mgrid» будет другим подходом. – Divakar

+0

Большое спасибо, это действительно помогло! – Matthew

1

Вы можете использовать следующую

A = np.arange(16).reshape(4,4) 
print np.ravel(A[row,:][:,column]) 

получить:

array([ 0, 2, 8, 10]) 
1

MATLAB создает 2D сетки, когда индексируются с векторами по размерам. Так, в MATLAB, вы бы -

A = 
    0  1  2  3 
    4  5  6  7 
    8  9 10 11 
    12 13 14 15 
>> row = [1, 3]; column = [1, 3]; 
>> A(row,column) 
ans = 
    0  2 
    8 10 

Теперь в NumPy/Python, индексация с векторами по измерениям выбирают элементы после изготовления tuplets из каждого элемента в этих векторах. Чтобы воспроизвести поведение MATLAB, вам нужно создать сетку таких индексов из векторов. Для того же, вы можете использовать np.meshgrid -

In [18]: A 
Out[18]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15]]) 

In [19]: row = [0, 2]; column = [0, 2]; 

In [20]: C,R = np.meshgrid(row,column) 

In [21]: A[R,C] 
Out[21]: 
array([[ 0, 2], 
     [ 8, 10]]) 
Смежные вопросы