Изучите NumPy и приступайте к практике уже сегодня.

Цель этой статьи — познакомить вас с наиболее широко используемой библиотекой для работы с массивами в Python, NumPy.

Массив NumPy похож на список. Обычно он имеет фиксированный размер, и каждый элемент относится к одному типу. Мы можем преобразовать список в массив numpy, сначала импортировав NumPy.

#Import the numpy package
import numpy as np
# Create a numpy array
a = np.array([0, 1, 2, 3, 4])
a
[out]: array([0, 1, 2, 3, 4])

Почему NumPy вместо списка?

Массивы NumPy более компактны, чем списки Python — список списков, как вы описываете, в Python занял бы не менее 20 МБ или около того, в то время как трехмерный массив NumPy с числами с плавающей запятой одинарной точности в ячейках уместился бы в 4 МБ. Доступ к элементам также быстрее с NumPy. NumPy не просто более эффективен; это также более удобно. Вы получаете множество векторных и матричных операций бесплатно, что иногда позволяет избежать лишней работы. И они также эффективно реализуются. Посмотрите на следующий пример, который показывает время, необходимое списку и массиву NumPy для обработки математической операции:

import time
import sys
SIZE = 100000
#Lists
L1 = range(SIZE)
L2 = range(SIZE)
#NumPy arrays
A1 = np.arange(SIZE)
A2 = np.arange(SIZE)
start = time.time()
#calculate the sum and store it in result
#write a for loop
result = [(x+y) for x,y in zip(L1,L2)]
print((time.time()-start)*1000)
start = time.time()
#but in array its easy
result = A1+A2
#Multiply 1000 because by default it's in sec..we need in millisec
print((time.time()-start)*1000)
[Out]:28.050899505615234
      3.9412975311279297

Примеры — лучший способ понять и попрактиковаться. В статье мы рассмотрим множество примеров. Давайте рассмотрим некоторые основные атрибуты массива. Мы можем получить доступ к каждому элементу в NumPy с помощью квадратных скобок.

a = np.array([0, 1, 2])
#Print each element
print("a[0]:", a[0])
print("a[1]:", a[1])
print("a[2]:", a[2])
[out]:a[0]: 0
      a[1]: 1
      a[2]: 2

В Numpy размеры называются осями. Количество осей называется рангом массива. Класс массива NumPy называется ndarray.

#Create an array called juice
juice = np.array([['lemonade','juice']])
print("Shape of the array:",juice.shape)
print("Type of the array",type(juice))
#Check the type of the values stored in numpy array
print(juice.dtype)
[out]:Shape of the array: (1, 2)
      Type of the array <class 'numpy.ndarray'>
      <U8
#Get the size of numpy array
print("The size of the array is",juice.size)
#Get the number of dimensions of numpy array
print("no.of dimensions:",juice.ndim)
[out]:The size of the array is 2
      no.of dimensions: 2

Массивы NumPy также можно создавать с исходным содержимым-заполнителем. NumPy предлагает несколько функций для создания таких массивов, чтобы свести к минимуму необходимость выращивания массивов, что является дорогостоящей операцией.

Например: np.zeroes,np.ones,np.full,np.empty и т. д.

В следующем примере объясняется, как добавлять, нарезать, сглаживать и изменять форму массива.

Ось:В приведенном ниже примере ось =0 может показаться запутанной в начале, но это очень просто. Axis=0 означает, что вы добавляете строку массива, поэтому убедитесь, что размеры указаны правильно. например: food_cat - это массив (2,2), поэтому массив сока должен иметь одинаковую размерность столбца, т.е. (1,2) или (2,2), но не (2,1). Если форма (2,1), то мы должны сделать ее совместимой с помощью juice.reshape(2,1)

juice = np.array([['lemonade','juice']])
food_class = np.array([['apple','fruits'],['broccoli','veggies']])
# we are appending it to the row.
food_cat = np.append(arr=food_class,values=juice, axis=0)
#Another method to append is by using concatenate as below commented code.
#food_cat = np.concatenate((food_class,juice),axis=0)
print(food_cat)
[out]: [['apple' 'fruits']
        ['broccoli' 'veggies']
        ['lemonade' 'juice']]
#one more to practice
all_foods= np.append(arr=food_cat,values[['fish','seafood']],axis=0)[out]: array([['apple', 'fruits'],
       ['broccoli', 'veggies'],
       ['lemonade', 'juice'],
       ['fish', 'seafood']], dtype='<U8')

Нарезка. Как и списки в Python, массивы NumPy можно нарезать. Поскольку массивы могут быть многомерными, вам необходимо указать срез для каждого измерения массива.

#Slicing all the 1st column elements in first 4 rows from the earlier eg:
print(all_foods[:4,0])
[out]:['apple' 'broccoli' 'lemonade' 'fish']
#Slicing all the 2nd column elements in first 4 rows of the eg: print(all_foods[:4,1])
[out]: ['fruits' 'veggies' 'juice' 'seafood']
#Using index to select an element.
print(all_foods[1][0])
[out]: broccoli

Сведение массива. Мы можем использовать метод сглаживания, чтобы свернуть копию массива в одно измерение. Также массивы случайных значений могут быть созданы с помощью random.

#Flatten array
A = np.array([[1,2,3],[4,5,6]])
flatten_A = A.flatten()
print("\nOriginal array:\n",A)
print("Flattened array:\n",flatten_A)
[out]:Original array:
 [[1 2 3]
 [4 5 6]]
Flattened array:
 [1 2 3 4 5 6]
#Create an array with random values
r = np.random.random((2,2))
print("\nA random array: \n",r)
[out]: A random array: 
 [[0.59736977 0.33503509]
 [0.23195993 0.61829267]]

Математические функции:

Linspace: полезной функцией для построения математических функций является «linespace». Linespace возвращает равномерно распределенные числа в течение заданного интервала. Мы указываем начальную точку последовательности и конечную точку последовательности, количество элементов возвращается.

# Makeup a numpy array within [-2, 2] and 5 elements
np.linspace(-2, 2, num=5)
[out]: array([-2., -1.,  0.,  1.,  2.])
#The value of pi
# Makeup a numpy array within [0, 2π] and 10 elementsx = np.linspace(0, 2*np.pi, num=10)

Универсальные функции (ufunc): NumPy предоставляет тригнометрические функции, такие как sin, cos, tan и т. д. Определите массив тета-значений и просто постройте тригнометрические функции. Другие функции, такие как np.add, np.subtract, np.multiply, np.divide, np.sum и т. д., также можно выполнять с помощью NumPy.

import matplotlib.pyplot as plt
theta = np.arange(0,3*np.pi,0.1)
y = np.sin(theta)
plt.plot(theta,y)
plt.show()

Аналогично, на рисунке ниже показаны функции cos и tan.

Мы также можем выполнять экспоненты и логарифмы. Также доступны обратные.

x = [1, 2, 3]
print("x     =", x)
print("e^x   =", np.exp(x))
print("2^x   =", np.exp2(x))
print("3^x   =", np.power(3, x))
[out]:
x     = [1, 2, 3]
e^x   = [ 2.71828183  7.3890561  20.08553692]
2^x   = [2. 4. 8.]
3^x   = [ 3  9 27]
x = [1, 2, 4, 10]
print("x        =", x)
print("ln(x)    =", np.log(x))
print("log2(x)  =", np.log2(x))
print("log10(x) =", np.log10(x))
[out]:
x        = [1, 2, 4, 10]
ln(x)    = [0.         0.69314718 1.38629436 2.30258509]
log2(x)  = [0.         1.         2.         3.32192809]
log10(x) = [0.         0.30103    0.60205999 1.        ]

Скалярный продукт. Скалярный продукт двух массивов numpy u и v определяется по формуле:

# Create a numpy array
u = np.array([1, 2])
v = np.array([3, 2])
# Calculate the dot product
np.dot(u, v)
[out]: 7
Adding constant to a NumPy array:
# Create a constant to numpy array
u = np.array([1, 2, 3, -1])
# Add the constant to array
u + 1
[out]: array([2, 3, 4, 0])
# Get the biggest value in the numpy array
max_u = u.max()
max_u
[out]:3
# Get the smallest value in the numpy array
min_u = u.min()
min_u
[out]:-1
#Transpose of array
a = np.array([[1,2,3],[3,4,5],[9,6,0]])
print("\nOriginal array:\n",a)
print("Transpose of array:\n",a.T)
[out]: Original array:
 [[1 2 3]
 [3 4 5]
 [9 6 0]]
Transpose of array:
 [[1 3 9]
 [2 4 6]
 [3 5 0]]

Так что это было основой для нескольких дополнительных операций NumPy. Существует множество функций, которые еще предстоит изучить, например:Сортировка. Массивы Numpy поддерживают множество типов операций с большими объемами данных. Обычно такие операции выполняются более эффективно и с меньшим количеством кода по сравнению со встроенными последовательностями Python.

Если вам понравилась эта статья или я помог кому-то из вас, не забудьте похлопать. Это будет мотивировать меня к исследованиям, обучению и участию в сообществе Data Science.