2015-03-15 4 views
3

Я занимаюсь чтением через Python для анализа данных Wes Mckinney, и я столкнулся со следующим примером, который немного запутан. Он относится к передаче нескольких массивов индексов в массив np.Индексирование с помощью Numpy инвертировано

Учитывая следующие np.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] 
[24 25 26 27] 
[28 29 30 31]] 

, когда мы выполняем фантазии индексации массива, используя следующие значения

arr[[1, 5, 7, 2], [0, 3, 1, 2]] 

следующих результатов

array([ 4, 23, 29, 10]) 

Это не совсем что бы я ожидал> Я понимаю, что он должен возвращать массив элементов размером 1 д. ding для каждого примера. Фактические значения, которые он возвращает, меня смущает.

Кортежи следует возвращающиеся на мой взгляд, будет (0,1), (5,3), (7, 1), (2, 2)

, которые должны вернуть [4, нет такого элемент, нет такого элемента, 10]

Что именно мне не хватает?

+0

(5, 3) и (7, 1) существуют в вашем массиве, почему вы ожидаете «нет такого элемента» для них? –

+1

Думаю, вы смешиваете строки и столбцы. Первый элемент - это элемент в позиции «Матрица [1,0]», что, в свою очередь, означает: Дайте мне элемент, который находится во второй строке первого столбца. – cel

+0

Я бы ожидал, что он вернет значение [x, y], я очень новичок в python, поэтому он просто кажется отличным от условностей на других языках. так эффективно возвращает [y, x] –

ответ

3

Когда индекс первого элемента в массиве 2D, arr, вы получите первую строку:

In [119]: arr = np.array([[0,1,2],[3,4,5]]) 

In [120]: arr 
Out[120]: 
array([[0, 1, 2], 
     [3, 4, 5]]) 

In [123]: arr[0] 
Out[123]: array([0, 1, 2]) 

В NumPy-жаргоне, «0-ось», следовательно, связан с рядами arr. Обратите внимание также тесную связь между arr и список списков

In [126]: lol = [[0,1,2],[3,4,5]] 

In [127]: lol[0] 
Out[127]: [0, 1, 2] 

Конечно, для списка списков, это имеет смысл, что lol[0] должен возвращать первый элемент, который [0, 1, 2]. arr[0] ведет себя одинаково - он возвращает то, что выглядит как строка .

Аналогичным образом, если вы нарезаете вторую ось, вы получите столбец.

In [125]: arr[:, 0] 
Out[125]: array([0, 3]) 

В общем, порядок индексов соответствует порядку осей. Сначала ось 0, вторая - 1 и т. Д.

Так что в 2D-массиве ось 0 связана с строками, а 1-ось - , связанная с столбцами.

Это может показаться вам обратным, если вы думаете о том, что элементы массива расположены вдоль осей x и y. В геометрии ось x обычно указывает вправо, а ось y - вертикальная. Поэтому в геометрии координата (x, y) сначала дает горизонтальный индекс, а затем вертикальный индекс.

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

+0

Спасибо за отличное объяснение! –

Смежные вопросы