Processing math: 100%

Многомерные массивы nympy (Numeric Python)

В многомерном массиве на каждую ось (axis) приходится свой индекс. Индексы передаются в виде кортежа, т.е. набора чисел, разделенных запятыми в круглых скобках (i1,i2,,in) см. здесь подробнее про массивы в numpy, scipy http://pages.physics.cornell.edu/~myers/teaching/ComputationalMethods/python/arrays.html

Атрибуты массива:

ndarray.ndim — число осей (измерений) массива. Как уже было сказано, в мире Python число измерений часто называют рангом.

ndarray.shape — размеры массива, его форма. Это кортеж натуральных чисел, показывающий длину массива по каждой оси. Для матрицы из n строк и m столбов, shape будет (n,m). Число элементов кортежа shape равно рангу массива, то есть ndim.

ndarray.size — число всех элементов массива. Равно произведению всех элементов атрибута shape.

ndarray.dtype — объект, описывающий тип элементов массива. Можно определить dtype, используя стандартные типы данных Python. NumPy здесь предоставляет целый букет возможностей, например: bool, character, int, int8, int16, int32, int64, float, float8, float16, float32, float64, complex, complex64, object_.

ndarray.itemsize — размер каждого элемента массива в байтах. Например, для массива из элементов типа float64 значение itemsize равно 8 (=64/8), а для complex32 этот атрибут равен 4 (=32/8).

ndarray.data — буфер, содержащий фактические элементы массива. Обычно нам не будет нужно использовать этот атрибут, потому как мы будем обращаться к элементам массива с помощью индексов.

In [1]:
import numpy as np
In [2]:
# выбор из многомерного массива 
b = np.array([[  0, 1, 2, 3],
   [10, 11, 12, 13],
   [20, 21, 22, 23],
   [30, 31, 32, 33],
   [40, 41, 42, 43]])
In [7]:
b.ndim 
Out[7]:
2
In [8]:
b.shape
Out[8]:
(5, 4)
In [9]:
b.size
Out[9]:
20
In [11]:
b.dtype
Out[11]:
dtype('int32')
In [13]:
b.itemsize
Out[13]:
4
In [14]:
b.data
Out[14]:
<memory at 0x000002161D6E7EA0>
In [15]:
# 1 строка 2 столбец
b[1,2]
Out[15]:
12
In [16]:
b[1][2]
Out[16]:
12
In [17]:
b[(1,2)]
Out[17]:
12
In [18]:
# последняя строка, смещение по кругу
b[-1]
Out[18]:
array([40, 41, 42, 43])
In [19]:
# предпоследняя строка
b[-2]
Out[19]:
array([30, 31, 32, 33])
In [20]:
# последний элемент
b[-1,-1]
Out[20]:
43
In [21]:
# срез подблока массива [н1:к1, н2:к2]
b[0:2, 0:3]
Out[21]:
array([[ 0,  1,  2],
       [10, 11, 12]])
In [22]:
# ошибка
b[, 0:3]
  File "<ipython-input-22-d9743bd12040>", line 2
    b[, 0:3]
      ^
SyntaxError: invalid syntax
In [23]:
b[:, 0:3]
Out[23]:
array([[ 0,  1,  2],
       [10, 11, 12],
       [20, 21, 22],
       [30, 31, 32],
       [40, 41, 42]])
In [24]:
# 2 столбец
b[:, 2]
Out[24]:
array([ 2, 12, 22, 32, 42])
In [25]:
# все столбцы до 2-го
b[:, :2]
Out[25]:
array([[ 0,  1],
       [10, 11],
       [20, 21],
       [30, 31],
       [40, 41]])
In [26]:
# столбцы после 2-го
b[:, 2:]
Out[26]:
array([[ 2,  3],
       [12, 13],
       [22, 23],
       [32, 33],
       [42, 43]])
In [27]:
# блок, шириной 2 с конца массива
b[:, -2:]
Out[27]:
array([[ 2,  3],
       [12, 13],
       [22, 23],
       [32, 33],
       [42, 43]])
In [31]:
# len возвращает длину первого измерения (оси)
# a = np.array([[1, 2, 3], [4, 5, 6]], float)
len(b)
Out[31]:
5
In [34]:
# in используется для проверки на наличие элемента в массиве
22 in b
Out[34]:
True
In [70]:
# reshape - создает новый массив
# переформатировать одномерный массив в двумерный
a = np.array(range(10), float)
a
Out[70]:
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
In [71]:
a = a.reshape((5, 2))
a
Out[71]:
array([[0., 1.],
       [2., 3.],
       [4., 5.],
       [6., 7.],
       [8., 9.]])
In [41]:
a.shape
Out[41]:
(5, 2)
In [44]:
# cвязывание имен в python работает и с массивами. 
# copy используется для создания копии существующего массива в памяти

a = np.array([1, 2, 3], float)
b = a
c =  a.copy()
a[0] = 0
a
Out[44]:
array([0., 2., 3.])
In [45]:
b
Out[45]:
array([0., 2., 3.])
In [46]:
c
Out[46]:
array([1., 2., 3.])
In [74]:
# преобразовать массив в список
a = np.array([1, 2, 3], float)
a.tolist()
Out[74]:
[1.0, 2.0, 3.0]
In [75]:
a
Out[75]:
array([1., 2., 3.])
In [76]:
b=list(a)
In [77]:
a
Out[77]:
array([1., 2., 3.])
In [78]:
# заполнение одинаковыми значениями
a.fill(0)
In [79]:
a
Out[79]:
array([0., 0., 0.])
In [81]:
#  flatten - конвертировать многомерный в одномерный
a = np.array([[1, 2, 3], [4, 5, 6]], float)
a
Out[81]:
array([[1., 2., 3.],
       [4., 5., 6.]])
In [86]:
a.flatten()
Out[86]:
array([1., 2., 3., 4., 5., 6.])
In [87]:
# concatenate - конкатенация массивов
a = np.array([1,2], float)
b = np.array([3,4,5,6], float)
c = np.array([7,8,9], float)
np.concatenate((a, b, c))
Out[87]:
array([1., 2., 3., 4., 5., 6., 7., 8., 9.])
In [88]:
# concatenate соединяет по первому измерению (axis=0), можно указать другое
a = np.array([[1, 2], [3, 4]], float)
b = np.array([[5, 6], [7,8]], float)
np.concatenate((a,b))
Out[88]:
array([[1., 2.],
       [3., 4.],
       [5., 6.],
       [7., 8.]])
In [89]:
np.concatenate((a,b), axis=0)
Out[89]:
array([[1., 2.],
       [3., 4.],
       [5., 6.],
       [7., 8.]])
In [92]:
np.concatenate((a,b), axis=1)
Out[92]:
array([[1., 2., 5., 6.],
       [3., 4., 7., 8.]])
In [94]:
# константа newaxis d квадратных скобках увеличивает размерность массива 
a = np.array([1, 2, 3], float)
a
Out[94]:
array([1., 2., 3.])
In [101]:
a[:,np.newaxis]
Out[101]:
array([[1.],
       [2.],
       [3.]])
In [104]:
a[:,np.newaxis].shape
Out[104]:
(3, 1)
In [106]:
a[np.newaxis,:]
Out[106]:
array([[1., 2., 3.]])
In [107]:
 a[np.newaxis,:].shape
Out[107]:
(1, 3)