Изучите 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.