1. Краткое введение
«Три мушкетера анализа данных» или «Три мушкетера машинного обучения», которые часто упоминаются в отрасли, относятся к трем библиотекам Python: numpy (вычисление), matplotlib (визуализация) и pandas (анализ). Если взять аналогию с естественнонаучными дисциплинами, то matplotlib эквивалентен «физике», pandas эквивалентен «химии», а numpy — «математике», которая является «краеугольным камнем», на который опираются другие дисциплины.
Numpy является краеугольным камнем, потому что numpy обеспечивает базовые структуры данных и вычислительную поддержку для таких вещей, как matplotlib и pandas. Основная структура данных numpyМногомерные массивы(ndarray: N-мерный массив).
2. Подготовка
Переход в этом подразделе немного резкий, но для плавного запуска кода на следующем шаге эта «подготовка» должна быть вставлена принудительно.
2.1 Установка
2.1.1 Проверьте, установлен ли он
conda list | grep numpy
или:
pip freeze | grep numpy
2.1.2 Установка
уже установлен, пожалуйста, пропустите.
conda install numpy
или:
pip install numpy
2.1.3 Обновление
Установил, по желанию обнови.
conda update numpy
или:
pip install --upgrade numpy
2.2 Импорт
np — это отраслевая аббревиатура.
import numpy as np
3. Многомерный массив (numpy.ndarray: N-мерный массив)
Если вы знакомы с Matlab (лаборатория матриц), мы знаем, что научные вычисления Matlab построены на «матрице». Однако многомерные массивы numpy имеют ту же цель.
3.1 Создать
3.1.1 Создать с помощью np.array()
Следующее создает многомерный массив numpy (numpy.ndarray) из двумерного списка. В numpy понятие измерения также называется秩
, называется по-английскиAxes
, поэтому созданный здесь двумерный массив мы также можем назвать秩
представляет собой многомерный массив из 2, который содержит 2轴(Axis)
. массивshape
Свойство представляет собой кортеж, соответствующий длине каждой оси многомерного массива;size
Атрибут представляет собой количество всех элементов многомерного массива, равное произведению всех элементов формы.
Звучит сложно, но на самом деле все очень просто.С помощью следующей распечатки мы можем интуитивно понять взаимосвязь между различными атрибутами.
na = np.array([[1, 2, 3], [4, 5, 6]])
print(
"""
对象类型:\t{}\n
形状:\t{}\n
维度(秩):\t{}\n
元素个数:\t{}\n
元素类型:\t{}\n
"""
.format(type(na), na.shape, na.ndim, na.size, na.dtype))
na
对象类型: <class 'numpy.ndarray'>
形状: (2, 3)
维度(秩): 2
元素个数: 6
元素类型: int64
array([[1, 2, 3],
[4, 5, 6]])
3.1.2 Создание с помощью np.zeros()
Если вы не знаете значение каждого элемента заранее, использование np.array() неизбежно немного громоздко.Напротив, просто сначала инициализируйте многомерный массив всеми нулями, np.zeros(), несомненно, более подходящий выбор . Использование np.zeros() требует только предоставления параметра shape, который также является первым позиционным параметром, для создания многомерного массива указанной формы и заполнения всех элементов массива 0 .
na = np.zeros((2, 3))
print("dtype: ", na.dtype)
na
dtype: float64
array([[0., 0., 0.],
[0., 0., 0.]])
Как видно из напечатанного выше свойства dtype, тип данных элемента по умолчанию — float64. Конечно, если вы не хотите использовать тип по умолчанию, вы можете установить его с помощью параметра dtype.
na = np.zeros((2, 3), dtype="uint8")
print("dtype: ", na.dtype)
na
dtype: uint8
array([[0, 0, 0],
[0, 0, 0]], dtype=uint8)
3.1.3 Создание с помощью np.ones()
np.ones() и np.zeros одинаковы, за исключением того, что они заполнены 1 вместо 0.
np.ones((2, 3), dtype="float")
array([[1., 1., 1.],
[1., 1., 1.]])
3.1.4 np.arange()
Пустая версия реализации range(). Передайте параметры start, end, step, чтобы создать массив 1D numpy.
np.arange(2, 10, 2)
array([2, 4, 6, 8])
Хотя метод np.arange() может создавать только одномерные массивы, метод reshape() массивов numpy может изменять форму без изменения размера. Обратите внимание, что метод reshape() — это метод экземпляров массива numpy, поэтому он подходит для любой ситуации, когда вы хотите «изменить» фигуру, включая использование np.linsapce(), описанное ниже.
np.arange(2, 13, 2).reshape(2, 3)
array([[ 2, 4, 6],
[ 8, 10, 12]])
В дополнение к методу reshape(), который может изменить форму, есть также метод resize(), который имеет ту же функцию, разница в том, что reshape() не изменяет исходный массив, а resize изменяет.
a = np.arange(2, 13, 2)
b = a.reshape(2, 3)
print("after call a.reshape():")
print("a.shape", a.shape)
print("b.shape", b.shape)
a.resize(2, 3)
print("after call a.resize():")
print("a.shape", a.shape)
after call a.reshape():
a.shape (6,)
b.shape (2, 3)
after call a.resize():
a.shape (2, 3)
3.1.5 np.linspace()
Как и np.arange() , он также создает одномерный массив numpy от начала до конца. Но есть два отличия:
- Третий параметр linsapce — это не размер шага, а количество точек в интервале
- Результат содержит end , а np.arange() — нет.
np.linspace(2, 10, 5)
array([ 2., 4., 6., 8., 10.])
3.1.6 np.random.random()
Укажите форму для генерации заполнения случайных чисел.
np.random.random((2, 3))
array([[0.22031976, 0.91591833, 0.63773627],
[0.92104449, 0.69246379, 0.82988843]])
3.1.7 np.random.normal(mu, sigma, len)
Создает одномерный массив стандартных нормальных распределений со средним значением mu, стандартным отклонением sigma и длиной len.
import matplotlib.pyplot as plt
%matplotlib inline
mu = 2
sigma = 0.5
v = np.random.normal(mu, sigma, 10000)
plt.hist(v, bins=50, density=1)
plt.show()
3.2 Чтение
3.2.1 Индексы кортежей
Длина кортежа равна размерности массива (Axes rank), то есть каждая ось (Axis) многомерного массива имеет индекс, а скобки кортежа можно опустить.
na = np.random.random((2, 3))
print(na[(1, 2)])
print(na[1, 2])
0.7547734386512726
0.7547734386512726
3.2.2 Метод обычного многомерного списка
na[1][2]
0.7547734386512726
3.3 Статистические операции
3.3.1 Найдите максимальное значение
v = np.random.normal(10, 1, 10000)
v.max()
13.949035793082137
3.3.2 Нахождение минимального значения
v.min()
6.31475048427698
3.3.3 Суммирование
v.sum()
100051.11447780298
3.3.4 Нахождение среднего значения
v.mean()
10.005111447780298
3.3.5 Нахождение стандартного отклонения
v.std()
0.996315432751019
3.3.6 Нахождение медианы
np.median(v)
10.005551763169866
3.4 Зачем использовать многомерные массивы numpy
В этот момент у вас могут возникнуть сомнения, чувствуя, что многомерные массивы numpy — это не что иное, как списки, похожие на списки. Да, с точки зрения структуры и использования, это правда, что многомерные массивы и списки numpy имеют много общего. В анализе больших данных, машинном обучении, особенно глубоком обучении и других сценариях, требующих расчета больших объемов данных, его производительность будет намного выше, чем у обычных списков.
Следующее вычисляет среднее значение массива длиной 300 000 000 (300 миллионов), а распределение вычисляется с использованием списков и массивов numpy. Первое заняло 15 секунд, второе — менее 2 миллисекунд. Причина, по которой существует такой большой разрыв, заключается в том, что основные операции numpy реализованы на языке C, а производительность языка C по сравнению с python очевидна.
from time import time
a = list(range(300000000))
na = np.array(na)
start_time = time()
sum(a) / len(a)
print("calculate mean by list cost time {} s".format(time() - start_time))
start_time = time()
na.mean()
print("calculate mean by numpy.ndarray cost time {} s".format(time() - start_time))
calculate mean by list cost time 20.95879817008972 s
calculate mean by numpy.ndarray cost time 0.0011792182922363281 s
Вам также может понравиться
- [1] Набор инструментов для анализа данных Python pandas (1)
- [2] набор инструментов для визуализации данных python matplotlib
Нелегко настаивать на написании колонки. Если вы считаете, что эта статья полезна для вас, не забудьте поставить лайк. Спасибо за поддержку!
- Персональный сайт:kenblog.top
- сайт на гитхабе:kenblikylee.github.io
Отсканируйте QR-код в WeChat, чтобы получить оригиналы новейших технологий