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

# ### Урок 3.3: `Ndarray`: базовая концепция

# In[1]:


import numpy as np


# Ndarray – это n-мерный массив (сокращение от *n-dimensional array*), структура данных, которая позволяет хранить набор элементов одного типа: либо только целые числа, либо числа с плавающей точкой, либо строки, либо булевы (логические) значения. Массивы могут быть одномерными, то есть представлять собой простой список значений:

# In[2]:


np.array([2, 3, 4])


# А могут быть многомерными (n-мерными), то есть представлять собой вложенный список («список списков»):

# In[3]:


np.array([[5, 2, 3.5], 
          [1, 9, 6.5]])  # двумерный


# Или даже «список таблиц»:

# In[4]:


np.array([[[6, 3],
        [6, 8]],
      [[1, 0],
        [0, 1]]])  # трехмерный


# Мы чаще всего будем работать с двумерными массивами. Про двумерный массив можно думать как про таблицу. Так, массив во втором примере выше можно рассматривать как таблицу, состояшую из двух строк и трёх столбцов, как таблицу $2 \times 3$ (сначала указывается число строк, затем – число столбцов). Отсюда следует важный факт: число элементов в списках внутри массива должно совпадать. Проверим на примере – возьмём списки разной длины, то есть списки, состоящие из разного числа элементов, и объединим их в массив:

# In[8]:


np.array([[0, 0, 1],
         [0, 1]]) 


# Получилось что-то немного странное. Никакой ошибки Python не выдан, но воспринимать этот объект как полноценный массив он уже не будет: он будет считать, что в такой таблице у нас есть две строки и ноль столбцов!

# Теперь давайте посмотрим, что будет, если мы попробуем объединить в массив объекты разных типов, например, целые числа и числа с плавающей точкой:

# In[14]:


np.array([[5, 8.2], 
         [1.2, 1,]])


# Все элементы были автоматически приведены к одному типу (можно считать, что тип *float* «сильнее» типа *integer*). А что будет, если мы попробуем добавить в массив целые числа и строки?

# In[5]:


np.array([["Ann", "Kate"],
        [23, 34]])


# Строковый тип оказался сильнее, все элементы были приведены к строковому типу (`U4` – строки не длинее 5 символов).
