#!/usr/bin/env python
# coding: utf-8

# ### Урок 3.4 Базовые операции над массивами
# ### Характеристики массива

# In[1]:


import numpy as np


# Итак, для начала познакомимся с характеристиками самого массива. Создадим массив `m` и будем с ним работать. Для того, чтобы массив `m` не казался чем-то абстрактным, давайте считать, что он содержит данные по трём парам шахматистов, которым предстоит сыграть партию друг с другом, а именно, их места в турнирной таблице.

# In[2]:


m = np.array([[2, 5], 
              [6, 8], 
              [1, 3]])
m


# В предыдущем уроке мы обсуждали, что массивы бывают многомерными, значит, у массива есть число измерений. Давайте его найдём:

# In[3]:


m.ndim


# Действительно, всего два измерения: чтобы указать на число 5 из этого массива, нам понадобятся всего две координаты – номер строки и номер столбца. Теперь посмотрим на форму или вид массива (*shape*):

# In[4]:


m.shape  # 3 строки и 2 столбца, т.е. 3 списка по 2 элемента


# А как узнать общее число элементов в массиве? Очень просто – запросить его длину или размер (*size*):

# In[5]:


m.size  # всего 6 элементов


# ### Обращение к элементам массива

# Продолжим работать с нашим массивом `m` и попробуем поработать с его элементами.

# In[6]:


import numpy as np
m = np.array([[2, 5], 
              [6, 8], 
              [1, 3]])


# In[7]:


m


# Попробуем узнать, какое место в турнирной таблице занимает первый шахматист во второй паре, то есть обратиться к числу 8. Нас интересует список с индексом 1 (в Python нумерация начинается с нуля), а в нем – элемент с индексом 0. 

# In[8]:


m[1][0] 


# In[9]:


m[1, 0]  # или так 


# А если обратимся к элементу с несуществующим индексом, то, конечно, получим ошибку:

# In[10]:


m[2][3]


# Можем вывести на экран места шахматистов в последней паре:

# In[11]:


m[2] # элемент с индексом 2 - третий список в массиве


# Ещё можно выбирать сразу несколько элементов массива. Для этого воспользуемся так называемыми срезами (*slices*):

# In[12]:


m[0:2]  # с элемента с индексом 0 до элемента с индексом 1 включительно


# Обратите внимание: правый конец среза не включается.

# Концы среза можно опускать, если нас интересуют все элементы, начиная с некоторого элемента и до конца массива или начиная с первого элемента массива и до некоторого элемента (правый конец точно так же включаться не будет):

# In[13]:


m[1:] # с элемента с индексом 1 до конца


# In[14]:


m[:2] # с начала массива до элемента с индексом 1 включительно


# Еще можно взять полный срез – выбрать все элементы массива:

# In[15]:


m[:] 


# Кроме того, при выборе элементов можно выставлять шаг. По умолчанию мы выбираем все элементы подряд, шаг равен 1, но это можно изменить:

# In[16]:


m[0:3:2]  # с нулевого по третий через 2


# Концы среза по-прежнему можно опускать:

# In[17]:


m[0::2]


# Или сделать более интересную вещь, взять отрицательный шаг и выбрать все элементы в обратном порядке, с конца:

# In[18]:


m[::-1]


# На этом мы пока закончим работать с элементами массива, а в следующем уроке посмотрим, как выполнять вычисления с массивами и создавать разные массивы с нуля.
