numpy
индексирование построено на python
соглашениях по списку, но распространяется на многомерное и многоэлементное индексирование. Это мощная, но сложная система, но рано или поздно вам следует прочитать полную документацию indexing
, в которой проводится различие между «базовым c» и «расширенным» индексированием.
Как и range
и arange
, индекс среза имеет значение остановки «open»
In [111]: a = np.arange(1,10).reshape(3,3)
In [112]: a
Out[112]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
Индексирование с помощью скаляра уменьшает размер независимо от того, где:
In [113]: a[1,:]
Out[113]: array([4, 5, 6])
In [114]: a[:,1]
Out[114]: array([2, 5, 8])
Это также означает, что a[1,1]
возвращает 5
, а не np.array([[5]])
.
Индексирование с помощью среза сохраняет размерность:
In [115]: a[1:2,:]
Out[115]: array([[4, 5, 6]])
, так же как и индексирование со списком или массивом (хотя это делает copy
, а не view
):
In [116]: a[[1],:]
Out[116]: array([[4, 5, 6]])
...
является обобщенным :
- используйте столько, сколько необходимо.
In [117]: a[...,[1]]
Out[117]:
array([[2],
[5],
[8]])
Размеры можно настроить с помощью newaxis
или изменить:
In [118]: a[:,1,np.newaxis]
Out[118]:
array([[2],
[5],
[8]])
Обратите внимание, что трейлинг :
является автоматическим c. a[1]
совпадает с a[1,:]
. Но ведущие должны быть явными.
Индексирование списка также удаляет «слой измерений / вложенности»
In [119]: alist = [[1,2,3],[4,5,6]]
In [120]: alist[0]
Out[120]: [1, 2, 3]
In [121]: alist[0][0]
Out[121]: 1
In [122]: [l[0] for l in alist] # a column equivalent
Out[122]: [1, 4]