目录
4.2.8 t1[[0, 2, 2], [0, 1, 3]]
5.4.1 np.where(t1 < 15000, 0, 10)
10.1 需求:统计行均值时,出现nan,如何处理nan的值?
10.2 需求:绘制出youybe的数据,制出评论数量的直方图
# 开篇
参考:
-
numpy:用来处理数值型的数据;
-
pandas:用来处理数值,以及字符串,字典、列表等数据的;
# 补充
zeros & ones
np.zeros((t2.shape[0], 1)) & ones_data = np.ones((t2.shape[0], 1)) :构造全为0的数据,构造全为1的数据:
zeros_data = np.zeros((t2.shape[0], 1)) # 创建一个3行1列的数组,全为0
ones_data = np.ones((t2.shape[0], 1)) # 创建一个3行1列的数组,全为1
t2 = np.arange(12, 24).reshape(3, 4)
print(t2)
print("*" * 100)
zeros_data = np.zeros((t2.shape[0], 1)) # 创建一个3行1列的数组,全为0
print(zeros_data)
print("*" * 100)
ones_data = np.ones((t2.shape[0], 1)) # 创建一个3行1列的数组,全为1
print(ones_data)
eye
np.eye(3) # 创建一个3行3列的对角矩阵:
t2 = np.eye(3) # 创建一个3行3列的对角矩阵
print(t2)
1. numpy数组的创建
1.1 array
np.array([1,2,3]) :创建numpy数组
import numpy as np
t1 = np.array([1, 2, 3])
print(t1)
print(type(t1))
1.2 range
range(10) :生成0-9的数组
# 默认生成0到9,十个数字
t2 = np.array(range(10))
print(t2)
1.3 arange
np.arange(4, 10, 2) :取4-10区间,步长为2
t3 = np.arange(4, 10, 2)
print(t3)
np.array(range(1, 4), dtype=float) :指定返回的类型为浮点数
t4 = np.array(range(1, 4), dtype=float)
print(t4)
print(t4.dtype)
1.4 常见的数据类型
类型 | 类型代码 | 说明 |
---|---|---|
int8, uint8 | i1, u1 | 有符号和无符号的8位(1个字节)整数 |
int16, uint16 | i2, u2 | 有符号和无符号的16位(2个字节)整数 |
int32, uint32 | i4, u4 | 有符号和无符号的32位(4个字节)整数 |
int64, uint64 | i8, u8 | 有符号和无符号的64位(8个字节)整数 |
float16 | f2 | 半精度浮点数 |
float32 | f4或f | 标准的单精度浮点数。与C的float兼容 |
float64 | f8或d | 标准的双精度浮点数。与C的double和Python的float对象兼容 |
float128 | f16或g | 扩展精度浮点数 |
complex64, complex128 | c8, c16 | 分别用两个32位、64位或128位浮点数表示的复数 |
complex256 | c32 | |
bool | ? | 存储True和False值的布尔类型 |
1.5 astype
np.astype("int8") :调整数据类型
# numpy中的bool类型
t5 = np.array([1, 1, 0, 1, 0, 1], dtype=bool)
print(t5)
print(t5.dtype)
# 调整数据类型
t6 = t5.astype("int8")
print(t6)
print(t6.dtype)
1.6 random.random() & round
random.random() & np.round(t7, 2) :随机生成小数 & 保留后两位小数
# 随机生成10个小数
t7 = np.array([random.random() for i in range(10)])
print(t7)
print(t7.dtype)
# 执行后两位小数
t8 = np.round(t7, 2)
print("*" * 100)
print(t8)
2. numpy数组计算和数组计算
2.1 reshape
np.arange(100, 124).reshape(4, 6) :默认生成100, 124区间数字,形成一个4行6列的数组
t6 = np.arange(100, 124).reshape(4, 6)
print(t6)
2.2 shape
np.shape :返回数组的元组
t1 = np.arange(12)
print(t1)
print(t1.shape) # (12,) 用元组返回数组的行数
print("*" * 100)
t2 = np.array([[1, 2, 3], [4, 5, 6]])
print(t2)
print(t2.shape) # (2, 3) 用元组返回数组的行数2,返回3数组的列数
print("*" * 100)
t3 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(t3)
print(t3.shape) # (2, 2, 2) 第一个2代表数组有两个块,每块有2行,每行有2列
2.3 将一维数组变成多维数组
np.reshape(3, 4) :将一维数组变成多维数组
t4 = np.arange(12)
print(t4)
print("*" * 100)
print(t4.reshape((3, 4))) # 将t4一维数组变成3行4列的数组
print("*" * 100)
print(t4.reshape((3, 5))) # 3行5列的数组,报错
2.4 指定一维数组成为多维数组
np.arange(24).reshape((2, 3, 4)) :指定一维数组成为多维数组
# 指定一维数组成为多维数组
t5 = np.arange(24).reshape((2, 3, 4)) # 2个块,每块3行,每行4列
print(t5)
注:有返回值,但是不会对自身数据进行修改;
可以使用:变量 = 变量
方式赋值;
# 指定一维数组成为多维数组
t5 = np.arange(24).reshape((2, 3, 4)) # 2个块,每块3行,每行4列
print(t5)
print("*" * 100)
print(t5.reshape((4, 6)))
print("*" * 100)
print(t5) # 改变数组形状,不会改变数组内容
2.5 使用代表24行,仅1列
np.reshape(24, 1) :使用代表24行,仅有1列
注意:np.reshape(x, xx)
前面参数代表行,后面参数代表列;
t5 = np.arange(24)
print(t5.reshape(24, 1)) # 24行1列
2.6 将数组变成一维数组
np.reshape((t5.shape[0] * t5.shape[1],)) :将数组变成一维数组
t5.shape[0]
代表行;
t5.shape[1]
代表列;
相乘就是一个首元素等于24元组;
t5 = np.arange(24).reshape((4, 6))
print(t5)
print("*" * 100)
t6 = t5.reshape((t5.shape[0] * t5.shape[1],)) # 将数组变成一维数组
print(t6)
2.7 flatten
np.flatten() :快速的帮我们把数组变成一维数组;
t5 = np.arange(24).reshape((4, 6))
print(t5)
print("*" * 100)
print(t5.flatten()) # 将数组变成一维数组
2.8 数组和数组计算
np+2 :2加到数组中每个元素上
就是当numpy用于与树脂进行计算的时候,这个计算会被用于每一个数字;
t5 = np.arange(24).reshape((4, 6))
print(t5)
print("*" * 100)
print(t5 + 2) # 2加到数组中每个元素上
print("*" * 100)
print(t5 / 2) # 2除到数组中每个元素上
print("*" * 100)
print(t5 / 0) # 0除到数组中每个元素上
2.9 广播原则
问题:
- 数组形状为 (3, 3, 3) 能否与形状为 (3, 2) 的数组进行计算?不可以
- 数组形状为 (3, 3, 2) 能否与形状为 (3, 2) 的数组进行计算?可以
关键点:
- 维度对齐:可以将维度指的是
shape
所对应的数字个数。 - 例子:每列的数据减去每列的平均值的结果。
理解:
- 广播机制:NumPy 的广播机制允许形状不同的数组进行某些操作,但要求在维度和形状上能够相互兼容。一般情况下,计算中维度要么完全匹配,要么其中一个数组的维度为 1,以便进行广播。
举例:
- 形状为 (3, 3, 3) 的数组与形状为 (3, 2) 的数组进行操作时,必须要满足特定的维度对齐规则。
- 在这个例子中,可以考虑每列的数据减去每列的平均值的操作,即通过对齐和广播,使得形状不同的数组能够进行兼容操作。
总结:
- 检查数组的形状是否兼容,利用广播机制处理不同形状的数组。
- 实际操作时,需要考虑每个维度是否可以通过扩展或对齐使得操作合法。
2.9.1 数组t5 和数组t6 相加
t5 = np.arange(24).reshape((4, 6))
t6 = np.arange(100, 124).reshape((4, 6))
print(t5)
print("*" * 100)
print(t6)
print("*" * 100)
print(t5 + t6) # 两个数组相加
2.9.2 数组t5 和数组t8 相减
在数组运算中,不同的列,但是相同的行,是可以进行运算的;
t5 = np.arange(24).reshape((4, 6))
print(t5)
print("*" * 100)
t8 = np.arange(4).reshape(4, 1)
print(t8)
print("*" * 100)
print(t5 - t8) # 两个数组相减, 会在每一列上都减去相同维度的数组
t5 = np.arange(24).reshape((4, 6))
print(t5)
print("*" * 100)
t9 = np.arange(10)
print(t9)
print("*" * 100)
print(t5 - t9) # 在数组元素对应不上的时候,是无法进行运算
在元素对应不上的时候,是无法进行运算;
2.10 NumPy 中轴( axis )的概念及其应用
轴(axis)
在 NumPy 中,轴可以理解为方向,使用 0, 1, 2, ...
数字表示:
- 对于一维数组,只有一个
0
轴。 - 对于二维数组(如
shape=(2,2)
),有0
轴和1
轴。 - 对于三维数组(如
shape=(2,2,3)
),有0, 1, 2
轴。
计算应用
有了轴的概念后,计算会更加方便。例如:
- 计算一个二维数组的平均值,必须指定是计算哪个方向上的数字的平均值。
实例问题
在前面的知识中,轴在哪里?
import numpy as np
np.arange(0, 10).reshape((2, 5))
- 在
reshape
中,2
表示0
轴长度(包含数据的条数),5
表示1
轴长度(包含数据的条数)。因此,数组变成2x5
,共 10 个数据。
关键点总结
- 轴的编号:在 NumPy 中,从
0
开始编号,0
轴表示第一个维度,以此类推。 - 应用场景:在进行计算(如求和、平均等)时,需要明确指定计算的轴。
- 多维数组:多维数组中的轴编号根据数组的维度递增。
2.11 transpose
np.transpose(t2) :数组转置
行列转置,将行转置为列;
t2 = np.arange(12).reshape(3, 4)
print(t2)
print("*" * 100)
t3 = np.transpose(t2) # 转置
print(t3)