4-1 Numpy介绍与安装
为什么使用Numpy?
因为Numpy的底层实现是使用C++语言来编写的。执行效率会非常的高
Numpy是什么?
Numpy(Numerical Python) 是目前Python数值计算中最为重要的基础包。大多数计算包都提供了基于Numpy的科学函数功能,将Numpy的数组对象作为数据交换的通过语。
Numpy特点
- 提供高效多维数组
- 提供了基于数组的便捷算术操作以及广播机制
- 对数阶进行快熟的矩阵计算
- 对硬盘中数组进行读写操作
Numpy安装
pip install Numpy
官方文档
https://numpy.org/devdocs/user/quickstart.html
4-2 Numpy基本操作
创建N-维数组对象
生成数组最简单的方式就是使用array函数。array函数接收任意的序列对象,生成一个新的包含传递数据的Numpy数组
-
numpy.array(object)
-
import numpy as np li = [1,2,3,4] arr = np.array(li) arr # array([1, 2, 3, 4])
-
-
numpy.arange([start,]stop[,step,])`
-
import numpy as np arr = np.arange(1,5) arr # array([1, 2, 3, 4])
-
注意
- ndarray数组是一个通用的多维同类数据容器,意味着数组里面每一个元素均为相同类型。
数组的数据类型
类型 | 类型代码 | 描述 |
---|---|---|
int8,uint8 | i1,u1 | 有符号和无符号的8数位整数 |
int16,uint16 | i2,u2 | 有符号和无符号的16数位整数 |
int32,uint32 | i4,u4 | 有符号和无符号的32数位整数 |
int64,uint64 | i8,u8 | 有符号和无符号的64数位整数 |
float16 | f2 | 半精度浮点数 |
float32 | f4 | 标准单精度浮点数 |
float64 | f8 | 标准双精度浮点数 |
bool | ? | 布尔值,存储True或False |
string_ | S | ASCII字符串类型,eg:‘S10’ |
unicode_ | U | Unicode类型,eg:‘U10’ |
查看数组数据类型
arr.dtype
- 会自动推断生成数组的数据类型
指定数组的数据类型
numpy.array(object,dtype=None)
- 创建数组时通过dtype直接指定
arr.astype(dtype)
- 修改数组的指定类型
数组形状
arr.ndim
- 查看数组的维度,返回值为整数
arr.shape
- 查看数组的,返回值为整数
- 一维:返回的结果为(列,)
- 二维:返回的结果为(行,列)
- 三维:返回的结果为(块,行,列)
N-维数组对象
-
二维
-
三维
重塑数组
一维转多维
-
arr.reshape(shape, order="C")
-
shape为数组重塑形状
-
order表示重塑方向
- C顺序(行方向)重塑
- F顺序(列方向)重塑
-
import numpy as np arr = np.arange(6) arr.reshape((2,3))
-
多维转一维
arr.flatten()
arr.ravel()
数组转置与换轴
arr.transpose()
- 转置
arr.T
- 转置
arr.swapaxes()
- 换轴
创建数组其他函数
函数名 | 描述 |
---|---|
array | 将输入数据转换为ndarray数组,自动推断数据类型,默认复制所有输入数据 (类似于浅拷贝) |
asarray | 将输入数据转换为ndarray数组,但输入数据已经是ndarray则不再复制(类似于深拷贝) |
arange | python内建函数range的数组版,返回一个数组 |
zeros | 根据给定形状和数据类型生成全0数组 |
ones | 根据给定形状和数据类型生成全1数组 |
empty | 根据给定形状和数据类型生成一个没有初始化数值的空数组 |
full | 根据给定形状和数据类型生成指定数值的数组 |
Numpy数组算术
数组之所以重要是因为它允许我们进行批量操作数据并且没有任何for循环。也被称之为向量化
数组与标量的算术操作
数组与标量的算术操作会把计算参数传递给数组的每一个元素
广播的原则
广播的原则:如果两个数组的后缘维度的轴长度相符,或其中的乙方的长度位1,则认为它们是广播兼容的。广播会在缺失和或长度为1的维度上进行。
这句话乃是理解广播的核心。广播主要发生在两种情况,一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符,另外一种是有一方的长度为1。
数组维度不同,后缘维度的轴长相符
import numpy as np
arr1 = np.array([[0, 0, 0],[1, 1, 1],[2, 2, 2], [3, 3, 3]]) #arr1.shape = (4,3)
arr2 = np.array([1, 2, 3]) #arr2.shape = (3,)
arr_sum = arr1 + arr2
print(arr_sum)
输入结果如下:
'''
[[1 2 3]
[2 3 4]
[3 4 5]
[4 5 6]]
'''
上例中arr1的shape为(4,3),arr2的shape为(3,)。可以说前者是二维的,而后者是一维的。但是它们的后缘维度相等,arr1的第二维长度为3,和arr2的维度相同。arr1和arr2的shape并不一样,但是它们可以执行相加操作,这就是通过广播完成的,在这个例子当中是将arr2沿着0轴进行扩展。
数组维度相同,其中有个轴为1
import numpy as np
arr1 = np.array([[0, 0, 0],[1, 1, 1],[2, 2, 2], [3, 3, 3]]) #arr1.shape = (4,3)
arr2 = np.array([[1],[2],[3],[4]]) #arr2.shape = (4, 1)
arr_sum = arr1 + arr2
print(arr_sum)
输出结果如下:
[[1 1 1]
[3 3 3]
[5 5 5]
[7 7 7]]
arr1的shape为(4,3),arr2的shape为(4,1),它们都是二维的,但是第二个数组在1轴上的长度为1,所以,可以在1轴上面进行广播,如下图所示:
在这种情况下,两个数组的维度要保证相等,其中有一个轴的长度为1,这样就会沿着长度为1的轴进行扩展。
import numpy as np
# 1.输出0-9的数组arr
arr = np.array(range(10))
# 2.查看arr的数据类型
arr.dtype
# 3.创建0-5的数组arr1,并指定其数据类型为"bool" dtype为指定类型
arr1 = np.array(range(6),dtype='bool')
arr1
# 4.改变arr1的数据类型为"float64"
arr1.astype('float64')
# 5.输出0-15这16个元素中分成4行4列
arr2 = np.arange(16).reshape(4,4)
arr2
# 6.输出0-26这27个元素中分成3块3行3列
arr3 = np.arange(27).reshape(3,3,3)
arr3
# 7.输出4*4全为0的矩阵
# zeros 传入的为元组数组
arr4 = np.zeros((4,4))
arr4
# 8.输出2*3全为1的矩阵
arr5 = np.ones((2,3))
arr5
# 9.输出2*4全为8的矩阵
arr6 = np.full((2,4),8)
arr6
# 10.np.array()与np.asarray()区别。代码演示结合文字说明
data = np.arange(6)
arr1 = np.array(data)
arr2 = np.asarray(data)
data[1] = 66
print(arr1) # array 相当于复制,浅拷贝,
print(arr2) # asarray 相当于复制,深拷贝
# 11.np.ones()与np.ones_like()区别。代码演示结合文字说明
# ones 生成的是全部为浮点数的数组
# ones_like 生成一个和你所给的数组相同shape的全为1的数组
arr8 = np.arange(6).reshape(2,3)
np.ones_like(arr8)
# 12.创建一个3*3的二维数组并将其降为一维
arr = np.arange(6).reshape(2,3)
arr.flatten()
# 15.np.arange(16).reshape(4,4)与2做减法运算
arr9 = np.arange(16).reshape(4,4)
arr9+2
# 16.np.arange(16).reshape(4,4)与np.arange(16,32).reshape(4,4)做加法运算
arr10 = np.arange(16).reshape(4,4)
arr11 = np.arange(16,32).reshape(4,4)
arr10 + arr11
# 17.np.arange(8).reshape(2,4)与np.arange(4)运算吗?
# 对应位相加
arr12 = np.arange(8).reshape(2,4)
arr13 = np.arange(4)
print(arr12)
print(arr13)
print(arr12.shape)
print(arr13.shape)
arr12 + arr13
# 18.np.arange(8).reshape(2,4)与np.arange(4).reshape(1,4)运算吗?
arr14 = np.arange(8).reshape(2,4)
arr15 = np.arange(4).reshape(1,4)
print(arr14.shape)
print(arr15.shape)
arr14 + arr15
# 19.np.arange(8).reshape(2,4)与np.arange(4).reshape(4,1)运算吗?¶
# 当行与列中数组对不上,都不能进行运算
arr16 = np.arange(8).reshape(2,4)
arr17 = np.arange(4).reshape(4,1)
print(arr16.shape)
print(arr17.shape)