学numpy 这一篇就够用了

学 NumPy 前,先简单回答两个问题。

1.什么是 NumPy?

NumPy 是科学计算包。

2.NumPy 可以用来干什么?

NumPy 可以有效地存储和操作数值数组。并且相比于普通的 Python 列表,代码更少,运行速度更快。

概述

本文将分为两个部分:

第一部分是对 NumPy 数组的简单介绍,能让我们在学习之前有 numpy 数组的一个大致的轮廓。

第二部分是对 NumPy数组 的详细介绍。

Part 1: NumPy 数组介绍

每次我们要使用 NumPy库时都要进行导入(前提当然是 NumPy 已经下载安装好了)。导入的方法有多种,我们只需记住这最最常用的一种:

import numpy as np  # 这里可以翻译为:导入 NumPy 作为 np,可以理解为 NumPy 缩写为 np 了

现在我们已经成功导入了 NumPy 库了,让我们来创建第一个 NumPy 数组吧:

np.array([1, 2, 5, 8, 1])  # 使用 np.array() 创建一个 NumPy 数组
array([1, 2, 5, 8, 1])

接下来我们从下面几个方面来简单了解一下 NumPy 数组。

1. NumPy 数组是什么?

绝大多数情况下,NumPy 数组它就是一个数值类型的数组。

这个数组可以是一维的,例如:[3, 4, 8, 2] 或者 [3., 4.3, 5.]

也可以是二维的,例如:[[1, 8, 3], [8, 4, 6]] 或者 [[2., 3.4], [4.1, 5., 6.]]

还有更多维的,例如:[[[1, 2],[3, 8]], [[4, 3], [8, 1]]]

2. NumPy 数组的属性

对于一个 NumPy 数组,它有一些属性,比如 数据类型(dtype),表示数组里面的元素是整型的、浮点型的还是其他的。

3. 对单个 NumPy 数组的操作

对于一个 NumPy 数组,我们可以进行许多操作,比如 数组索引、 数组切片、 数组变形、 数组聚合、 数组排序、 数组分裂

下面我会依次介绍这些操作

拿一个数组作为例子,我们先创建一个 NumPy 数组(注意要使用 NumPy 库前要进行导入):

x = np.array([1, 4, 2, 5, 0])

现在 x 是一个 NumPy 数组了。

(1)我们可以用 数组索引 获取数组里面的元素:

x[0] # 数组 x 的第一个元素(下标是从 0 开始的)
1

(2)我们可以用 数组切片 获取子数组:

切片,顾名思义,把数组的一部分切出来。

x[0:2] # 切出数组 x 的前两个元素
array([1, 4])

(3)我们可以对数组进行 变形

x.reshape((5, 1)) # 将 x reshape(可以翻译为 重塑) 为 5 行 1 列的
array([[1],
       [4],
       [2],
       [5],
       [0]])

(4)我们可以将数组将数组进行 聚合

聚合,顾名思义,我们可以把整个数组聚合成一个数。(也可以把一个二维数组的每一行或每一列聚合成一个数,变成一个一维数组)

print(x)   # 数组 x
print(np.sum(x))  # 将 x 中的元素都加起来
print(np.mean(x))   # 计算 x 中元素的平均值
[1 4 2 5 0]
12
2.4

(5)我们也可以把数组进行 排序

print(x)           # 排序前
print(np.sort(x))  # 使用 np.sort() 进行排序后
[1 4 2 5 0]
[0 1 2 4 5]

(6)我们还可以把数组进行 分裂

分裂,顾名思义,把一个数组分裂出来。(注意和切片进行区分,切片只是切出一部分)

x1, x2 = np.split(x, [2])   # 把原数组分为 x1 和 x2 两部分,你可以尝试着理解一下是怎么分的,下一部分我会详细说明
print(x1, x2)
[1 4] [2 5 0]

4. 对多个 NumPy 数组的操作

上面我们我们介绍了对单个数组的操作,接下来我们介绍多个数组间的操作。
NumPy 数组间的操作最典型的就是 数组间的计算 ,此外还有 数组的拼接

(1)数组间的 ** 计算 **

x = np.array([4, 8, 6, 9])
y = np.array([2.1, 5.3, 4.7, 1])
x + y
array([ 6.1, 13.3, 10.7, 10. ])
x + 2   # “2” 可以看成一个 0 维数组,这里 x 中的每个元素都会加上 2 。事实上,这是一个“广播”操作,之后会详细介绍
array([ 6, 10,  8, 11])

(2)数组的 拼接
拼接,顾名思义,把两个或多个数组拼接在一起。

np.concatenate([x, y])   # 利用 np.concatenate() 拼接 x 和 y
array([4. , 8. , 6. , 9. , 2.1, 5.3, 4.7, 1. ])

Part 2:NumPy 数组的详细介绍

1. 创建 NumPy 数组

1)利用 列表 和 np.array() 创建 NumPy 数组
L = [2, 3, 5]  # 创建一个 Python 列表 L
x = np.array(L)
y = np.array([3, 4, 6.1])
print(x)
print(y)
[2 3 5]
[3.  4.  6.1]

请记住,不同于 Python 列表,NumPy 要求数组必须同一类型。如果类型不匹配,NumPy 会自动向上转换。

# 整型自动转换为浮点型:
x = np.array([2, 5.3, 2, 10])
x
array([ 2. ,  5.3,  2. , 10. ])
2)利用 np.arange() 创建一个线性序列数组

np.arange() 的参数依次是 start、stop、step

# start=0,stop=20,step=2
# 意思是 从 0 开始,到 20 结束,步长为 2
# 注意,输出是不会有 20(stop) 的
x = np.arange(0, 20, 2)
x
array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])

注意,使用 np.arange() 函数时输入的参数可以是 一个、两个或者三个。

①一个参数时,参数值为stop,start取默认值0,step取默认值1

a1 = np.arange(5)
a2 = np.arange(10)
print(a1)
print(a2)
[0 1 2 3 4]
[0 1 2 3 4 5 6 7 8 9]

②两个参数时,第一个参数为start、第二个参数为stop,step取默认值1

b1 = np.arange(2, 4)
b2 = np.arange(3, 7)
print(b1)
print(b2)
[2 3]
[3 4 5 6]

③三个参数时,第一个参数为start、第二个参数为stop、第三个参数为step

c1 = np.arange(1, 5, 1)
c2 = np.arange(5, 1, -1)   # step为负数时,你尝试从答案理解一下
c3 = np.arange(5, 1, -2)
print(c1)
print(c2)
print(c3)
[1 2 3 4]
[5 4 3 2]
[5 3]
3)创建随机数数组

①np.random.randint()

# 创建一个 3×3 的、[0, 10) 区间的随机整型数组
np.random.randint(0, 10, (3, 3))
array([[4, 3, 6],
       [8, 2, 5],
       [8, 4, 0]])

②np.random.random()

# 创建一个 3×3的、在0 ~ 1 之间的随机数组成的数组
np.random.random((3, 3))
array([[0.3404152 , 0.55781784, 0.61522996],
       [0.68567632, 0.73912314, 0.6967783 ],
       [0.76376602, 0.94942223, 0.986581  ]])

③np.random.normal()

# 创建一个 2×2的、均值为 0,标准差为 1 的
# 正态分布的随机数数组
np.random.normal(0, 1, (2, 2))
array([[1.32345339, 1.57178262],
       [0.72432636, 1.34134081]])
4)利用 np.linspace() 创建 NumPy 数组
# 创建一个 5 个元素的数组,这 5 个数均匀地分配到 0 ~ 1
a = np.linspace(0, 1, 5)

# 创建一个 3 个元素的数组,这 3 个数均匀地分配到 1 ~ 5
b = np.linspace(1, 5, 3)

print(a)
print(b)
[0.   0.25 0.5  0.75 1.  ]
[1. 3. 5.]
5)利用 NumPy 内置方法 创建特殊矩阵
# 创建一个长度为 10 的数组,数组的值都是 0 (整型)
x = np.zeros(10, dtype=int)
x
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
# 创建一个长度为 3×4 的浮点型数组,数组的值都是 1
x = np.ones((3, 4), dtype=float)
x
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])
# 创建一个 3×5 的数组,数组的值都是 8
x = np.full((3, 5), 8)
x
array([[8, 8, 8, 8, 8],
       [8, 8, 8, 8, 8],
       [8, 8, 8, 8, 8]])
# 创建一个 3×3 的单位矩阵
x = np.eye(3)
x
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
# 创建一个由 3 个整型数组成的未初始化的数组
# 数组的值都是内存空间中的任意值
np.empty(3)
array([1., 1., 1.])

2. NumPy 数组的属性

numpy 比较常用的属性是:shape (数组每个维度的大小)

# 先利用前面介绍过的 np.random.randint() 方法创建一个 3×4的、 [0, 10) 区间的随机整型数组
x = np.random.randint
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值