Введение в основы Numpy (2) — индексирование, нарезка и случайные числа

NumPy

«Это 21-й день моего участия в ноябрьском испытании обновлений. Подробную информацию о мероприятии см.:Вызов последнего обновления 2021 г."

Основное использование Anaconda

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

После установки Anaconda под Windows во всех программах под Anaconda можно увидеть следующие компоненты:

  • Anaconda Navigator: графический интерфейс для управления наборами инструментов и средами.

  • Anaconda Prompt: интерфейс командной строки для управления пакетами и средами.

  • Jupyter Notebook: интерактивная вычислительная среда на базе Интернета, которая демонстрирует процесс анализа данных и создает удобную для чтения документацию.

  • Spyder: Python IDE с макетом, похожим на Matlab.

    В основном мы используем третий Jupyter Notebook для обучения.

Вот простая популяризация часто используемых команд Anaconda (хотя я ими не часто пользуюсь).

  • Посмотреть номер версии программного обеспечения
python --version #查看Python版本
conda --version #查看conda的版
  • добавить зеркало
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
  • обновить конду
conda upgrade --all
  • Просмотр установленных пакетов
conda list
conda install [package name] #安装package,安装在默认的Python环境中

Рекомендуется устанавливать Anaconda только для начинающих, что может избавить от многих ненужных проблем.Выше приведено основное использование Anaconda.Вы можете добавить его в области сообщений.

Индексация и нарезка Numpy

Исправьте ошибку следующей статьи:

# 正确的导入方式
import numpy as np

Метод индексации numpy аналогичен индексации списка в Python, Здесь мы в основном вводим индексацию/нарезку обычных массивов и логических массивов.

Индексация/нарезка одномерных массивов

Индекс и срез одномерного массива такие же, как список в Python, индекс начинается с 0, а срез закрыт слева и открыт справа.

import numpy as np
ar = np.arange(20)
# 输出ar的第4个值
print(ar[3])
# 输出ar的前四个值
print(ar[:4])
>>>
4
[0 1 2 3]
Индексация/нарезка многомерных массивов

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


import numpy as np
ar = np.arange(16).reshape(4,4)
# 二维数组索引遵照先行后列(有以下两种写法)
# 选取第二行第二列的值
print(ar[2][2])
print(ar[2,2])
# 二维数组切片
# 取出前两行的值
print(ar[:2])
# 取出前两行后两列的值
print(ar[:2,2:])
>>>
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
10
10
[[0 1 2 3]
 [4 5 6 7]]
[[2 3]
 [6 7]]

Методы индексации и нарезки трехмерных массивов эквивалентны эволюционной версии двумерных массивов.

import numpy as np
ar = np.arange(12).reshape(3,2,2)
print(ar)
# 三维数组索引遵照先维度后行再列
print(ar[2][0][1])
print(ar[2,0,1])
# 切片
# 获取第一个数组的第一行的第一列的数
print(ar[:1,:1,:1])
>>>
[[[ 0  1]
  [ 2  3]]

 [[ 4  5]
  [ 6  7]]

 [[ 8  9]
  [10 11]]]
[[[0]]]
9
9
Логическое индексирование и нарезка

Использование логических массивов находится в центре внимания этой статьи.

# 简单展示一下布尔型的一维数组长啥样
i = np.array([True,False,True])
j = np.array([True,True,False,False])
print(i)
print(j)
>>>
[ True False  True]
[ True  True False False]

И то, что мы часто видим, это:

ar = np.arange(12).reshape(3,4)
print(ar)
print(ar>5)
>>>
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
 [[False False False False]
 [False False  True  True]
 [ True  True  True  True]]

Когда нам нужно отфильтровать значения больше 3 в ar, мы можем использовать логические значения для фильтрации следующим образом:

ar = np.arange(12).reshape(3,4)
print(ar[ar>3])
>>>
[ 4  5  6  7  8  9 10 11]
Numpy случайные числа
Равномерное и нормальное распределение

Генерация случайных чисел с равномерным и нормальным распределением

# numpy.random.rand() 生成一个0-1的随机浮点数或N维浮点数 --均匀分布
a = np.random.rand()
b = np.random.rand(4,4)
print(a)
print(b)
>>>
0.5544023939180306
[[0.46387648 0.97345876 0.12059175 0.7565951 ]
 [0.30192996 0.76633208 0.20107761 0.09315875]
 [0.79347118 0.26714404 0.08628158 0.72510313]
 [0.06606087 0.93260038 0.90268201 0.90941348]]

Генерация случайных чисел с нормальным распределением

# numpy.random.randn() 生成一个0-1的随机浮点数或N维浮点数 --正态分布
a = np.random.randn()
b = np.random.randn(4,4)
print(a)
print(b)
>>>
0.26901442604096687
[[ 0.40261375 -0.23541184  0.96607489 -1.11253043]
 [-0.31670703  0.05841136 -0.01862511  1.72597729]
 [ 0.17052799  1.03537825 -0.94375417  1.32484928]
 [ 0.132761    0.44950533  0.44131534 -0.11319535]]

Согласно приведенному выше методу написания, я считаю, что все понимают .randn() и .rand() недостаточно ясно, Вот наглядный способ показать это:

#平均分布
# numpy.random.rand() 生成一个0-1的随机浮点数或N维浮点数 --均匀分布
data1 = np.random.rand(500)
data2 = np.random.rand(500)
#正态分布
# numpy.random.randn() 生成一个浮点数或N维浮点数  --正态分布
data3 = np.random.randn(500)
data4 = np.random.randn(500)
import matplotlib.pyplot as plt
% matplotlib inline
plt.scatter(data1,data2)
plt.scatter(data3,data4)

Вот схема случайного распределения:

plt.scatter(data1,data2)

Вот график нормального распределения:

plt.scatter(data3,data4)

Видно, что отображение нормального распределения и случайного распределения сильно различается.Конечно, это только для того, чтобы углубить ваше понимание .randn() и .rand(), а больше вы узнаете после визуализации.

Другое использование случайных чисел Numpy
#随机整数
print(np.random.randint(2))
#在2-10之间生成随机整数
print((np.random.randint(2,10)))
# 在0-10之间生成10个整数
print((np.random.randint(10,size=10)))
# 在0-10之间生成包含10个元素的二维数组
print(np.random.randint(10,size=(2,5)))
# 在10-50之间生成包含10个元素的二维数组
print(np.random.randint(10,50,size=(2,5)))

Закрепляющие упражнения

  1. Создайте 2 нормально распределенных массива 1D с 10 элементами

  2. Пожалуйста, создайте массив ar по мере необходимости, а затем измените значение ar[:2,:2] на случайное число [0,1)

mark

  1. Создайте массив по мере необходимости и по индексу, какие у него ar[4], ar[:2,3:], ar[3][2]

mark

  1. Создайте массив по мере необходимости, отфильтруйте значения со значением элемента больше 5 и сгенерируйте новый массив

mark