用法汇总
''' NumPy(多维数组)语法汇总 标量 一个数 1(0维 一个点) 向量 一组数 [,1,2,3,4] (1维 一条线) 矩阵 [[,1,2,3,4], [,1,2,3,4], [,1,2,3,4]] (2维数组) 张量 多个矩阵组成 tensor n维 机器学习 1.导包 import numpy as np import pandas as pd import matplotlib.pyplot as plt # 画图 plt.rcParams['font.sans-serif'] = 'SimHei' plt.rcParams['axes.unicode_minus'] = False # 后两句是支持中文 2.ndarray n dim维度 array 数组 np.array(object,dtype=None,*,……) dtype:data type,元素的数据类型,不是数组的数据类型。可自己指定数据类型dtype,如dtype=np.int8 np.int8 :8位 11111111 2的8次方即256就是当前的数字不能超过256.其他依次类推 object 特点:默认所有元素的类型是相同的,如果传入的数据中包含不同类型的数据,会统一为同一类型。优先级:str>float>int 数据类型: int:int8、uint8、int16、int32、int64 float:float16、float32、float64 str:字符串 创建方式 1.array np.array() 传入列表得到数组 参数是列表 list1 = [1, 2, 3, 4] 常:n = np.array(list1) type(n) # numpy.ndarray 2.ones 可以生成多维数组 np.ones(shape,dtype=None,order='C') shape数据形状 如 (3,4) 四行三列整数 dtype=None 元素类型 order='C' 可以选C/F 默认是C 常: np.ones(3) 一维3个1 np.ones((3,4),dtype = np.int8) # 四行三列1 3.zeros 可以生成多维数组 与上ones差不多 常: np.zeros((3,4),dtype = np.int8) # 四行三列0 4.eye 5.linspace np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None) 创建等差数列 前两个参数必须写,第三个参数num是50,指默认生成50个数。 start 开始值 stop 结束值 num=50 默认生成50个数 endpoint=True 是否包含最后一个数,默认包含 retstep=False 是否返回等差值(步长),默认不返回 dtype=None 元素类型 常: np.linspace(2,100) # array([2,4,……,98,100]) 6.arange np.arange(start,stop,step,dtype=None) 与range差不多,只不过得到的是ndarray类型的数组 常: np.arange(2,100,2) 7.random.randint np.random.randint(low,high=None,size=None,dtype=None) low:最小值 high=None high=None时,生成的数值在[0,low)区间内 使用high时,生成的数值在[low,high)区间内 size=None 数组型状,默认只能生成一个随机值,类似前面的shape dtype=None 元素类型b 特点:可以生成多维数组 常: np.random.randint(0,100,size=6) 生成6个数的一维数组 np.random.randint(0,100,size=(6,5)) 生成6行5列的二维数组 np.random.randint(0,100,size=(6,5,7,8)) 生成四维数组(size/shape的()中有几个数就代表几维) 3.展现方式 1.print() 一般在numpy中不用这个 2.display() 跟print()差不多,但是在matplotlib画图展示的时候会更好看 4.四个重要属性 n.ndim 维度 n.shape 形状(各维度的长度) 重要,常用,其他了解即可 n.size 总长度 n.dtype 元素类型 5.基本操作 1.索引 1.一维 n1=np.arange(10,20) # array([10,11,12,13,14,15,16,17,18,19]) n1[3] # 13 n1[3],n1[-1] # (13,19) 2.多维 n2 = np.random.randint(10,30,size=(5,8)) # 5行8列的随机数组 n2[2] # array([27,10,29,19,27,29,17,11]) 取到第三行,得到一个一维数组 n2[2][-1] # 11 相当于在上面的一维数组中再取最后一个数(-1),得到11 可以简写为 n2[2,-1] # 11 2.根据索引修改值 1.一维 n1=np.arange(10,20) # array([10,11,12,13,14,15,16,17,18,19]) n1[3] = 9999 n1 # array([10,11,12, 9999 ,14,15,16,17,18,19]) 2.多维 n2[2,-1] = 666 n2 3.切片 1.一维 n1[:] # array([10,11,12,13,14,15,16,17,18,19]) 相当于取全部的 n1[3:] # array([13,14,15,16,17,18,19]) 从第三个数开始取 n1[3:6] # array([13,14,15]) 从第三个数开始取,到第六个数(最后一个不包含) 2.多维 1.取行 1.取一行:索引(上述) 2.取连续/有规律的多行 n2 = np.random.randint(0,10,size=(5,8)) # 5行8列的随机数组 n2[:3] # 取到数组的前三行,得到的是二维数组 n2[3:] # 取第四行到最后的数组,得到的是二维数组 n2[::-1] # 行倒序 最后一行变第一行……以此类推 3.取不连续的多行:使用中括号 n2[[4,3,3]] # 取 第四行,第三行,第三行 4.总结: 取一行:索引 取连续/有规律的多行:切片 取不连续的多行:使用中括号(重点) 2.取列 1.取一列:索引 n2[:,3] # 取第三列 逗号是分隔维度的(重要) 2.取连续/有规律的多列:切片 n2[:,:3] # 取第一列到第三列 3.取不连续的多列:使用中括号 n2[:, [4,3,3]] # 取第四列,第三列,第三列 2.根据索引修改值 1.一维 n1=np.arange(10,20) # array([10,11,12,13,14,15,16,17,18,19]) n1[3] = 9999 n1 # array([10,11,12, 9999 ,14,15,16,17,18,19]) 4.切片修改值 1.一维 n2[2:5] = 0 n2[2:5] = [666,777,888] # 三个索引对三个数,几个索引对应几个数(不能多/少) n2[[1,3,4]] = 0 # 将第一三四行的数改为0 2.多维 n = array([1,8,-3,8,8,6,5]) i = np.argwhere(n == np.max(n)) # array([[1],[3],[4]]) 二维 n[i] = 0 # 会自动将n[[[1],[3],[4]]]化简 n # array([1,0,-3,0,0,6,5]) 6.图片练习:把猫翻转 1.读取图片: cat = plt.imread('文件路径.jpg') # 三维数组 array([[[……]]]) 有几个[]就代表几维 图片: 三维:彩色图片 (421,725,3) 图片中 3 :三色 即RGB 421 :行 即高度 725 :列 宽度 二维:黑白图片 2.查看数据形状 cat.shape 3.显示图片 plt.imshow(cat) 图片存储:plt.imsave(cat,'图片保存地址') # 要用自查 4.上下翻转 行交换 plt.imshow(cat[::-1]) 5.左右翻转 列交换 plt.imshow(cat[:, ::-1]) 6.第三个维度翻转(颜色 红色和蓝色交换,绿色不变 第一行和第三行交换) plt.imshow(cat[:, :, ::-1]) 7.裁剪 plt.imshow(cat[50:370, 110:600]) 7.变形 reshape n1 = np.arange(1,21) # array([1,2,……,20]) n1.reshape(4,5) # 将这个数组变成4行5列的数 n1.reshape(2,2,5) # 三维 一定要保证重塑后的行×列的数量跟之前的数量相等 比如现在的20个数分成4×5,不一样会报错 为了减少计算,可以写-1,-1代表剩余的维度,会自动匹配。一个reshape里只能有一个-1: n1.reshape(4,-1) n1.reshape(2,2,-1) 8.聚合操作(一维) n1.sum() np.min(n1) np.max(n1) np.mean(n1) np.average(n1) # 不常用 np.median(n1) # 中位数 np.percentile(n1) # 百分位数 np.argmin(n1) # 最小值对应的下标 # 一般arg开头的都是取下标的 np.argmax(n1) # 最大值对应的下标 np.std(n1) # 标准差 np.var(n1) # 方差 = 标准差的平方 np.power(3,4) # 次方,次幂 3的4次方 3**4 # 更推荐使用这个 运行时间更短,书写简单 np.argwhere() # 按条件查找 n = array([1,8,-3,8,8,6,5]) np.argmax(n) = 1 # 最大值下标是1 n[np.argmax(n)] = 0 # 即 n[最大值下标]=n[1] = 0 就是把最大值下标的数据修改为0 argmax和argmin: 只会返回一个下标,只能找到一个 argwhere: np.argwhere(n == np.max(n)) # array([[1],[3],[4]]) 9.矩阵运算 1.矩阵积,矩阵乘(三种) np.dot(n3, n4) # 行乘列相加,线性代数的算法(第一个矩阵的列数 等于 第二个矩阵的行数) n3 * n4 # 但是n3、n4必须是同型矩阵 n3 * 10 # 矩阵乘以一个数 2.矩阵 和 数 数学运算 n + 10 n - 10 n * 10 n / 10 n // 2 n % 3 # 余数 n ** 3 # 次方 3.矩阵 和 数 比较运算符 n > 5 4.矩阵 和 矩阵 : 须是同型矩阵:行数和列数对应相等,但有特殊情况,在5中说明:广播机制 n3 * n4 n3 + n4 5.广播机制 1.尽可能扩展维度让2个矩阵变成同型矩阵 2.扩充维度的数据 会使用已经存在的数据 n1 = array([1,2,3]) n2 = array([[2,2,4], [1,1,3]]) n1 + n2 会先将n1变成 array([[1,2,3], [1,2,3]]) 然后再加上n2 array([[2,2,4], [1,1,3]]) 得到 array([[3,4,7], [2,3,6]]) 3.但是不能扩展成同型矩阵的时候会报错 6.线性代数中其他矩阵操作 n = np.array([[1, 2, 3], [2, 3, 4], [4, 6, 7]]) 3*3 方阵:行数==列数 阶数:3阶 提供线性代数的功能 np.linalg.det(n) # 行列式的值 行列式的值: 主对角线 - 副对角线 主对角线: 1*3*7 + 2*4*4 + 3*2*6 = 21+32+36 = 89 副对角线: 3*3*4 + 4*6*1 + 7*2*2 = 36+24+28 = 88 主对角线 - 副对角线 = 89 - 88 - 1 9.交换首尾两行 n1[[0, -1]] = n1[[-1,0]] 10.归一化 (n5 - min1) / (max1 - min1) # 得到[0,1]组合成的数据 '''
'''
NumPy(多维数组)语法汇总
标量 一个数 1(0维 一个点)
向量 一组数 [,1,2,3,4] (1维 一条线)
矩阵 [[,1,2,3,4],
[,1,2,3,4],
[,1,2,3,4]] (2维数组)
张量 多个矩阵组成 tensor n维 机器学习
1.导包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt # 画图
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 后两句是支持中文
2.ndarray
n dim维度 array 数组
np.array(object,dtype=None,*,……)
dtype:data type,元素的数据类型,不是数组的数据类型。可自己指定数据类型dtype,如dtype=np.int8
np.int8 :8位 11111111 2的8次方即256就是当前的数字不能超过256.其他依次类推
object
特点:默认所有元素的类型是相同的,如果传入的数据中包含不同类型的数据,会统一为同一类型。优先级:str>float>int
数据类型:
int:int8、uint8、int16、int32、int64
float:float16、float32、float64
str:字符串
创建方式
1.array
np.array() 传入列表得到数组
参数是列表
list1 = [1, 2, 3, 4]
常:n = np.array(list1)
type(n) # numpy.ndarray
2.ones
可以生成多维数组
np.ones(shape,dtype=None,order='C')
shape数据形状 如 (3,4) 四行三列整数
dtype=None 元素类型
order='C' 可以选C/F 默认是C
常:
np.ones(3) 一维3个1
np.ones((3,4),dtype = np.int8) # 四行三列1
3.zeros
可以生成多维数组 与上ones差不多
常: np.zeros((3,4),dtype = np.int8) # 四行三列0
4.eye
5.linspace
np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)
创建等差数列 前两个参数必须写,第三个参数num是50,指默认生成50个数。
start 开始值
stop 结束值
num=50 默认生成50个数
endpoint=True 是否包含最后一个数,默认包含
retstep=False 是否返回等差值(步长),默认不返回
dtype=None 元素类型
常: np.linspace(2,100) # array([2,4,……,98,100])
6.arange
np.arange(start,stop,step,dtype=None) 与range差不多,只不过得到的是ndarray类型的数组
常: np.arange(2,100,2)
7.random.randint
np.random.randint(low,high=None,size=None,dtype=None)
low:最小值
high=None
high=None时,生成的数值在[0,low)区间内
使用high时,生成的数值在[low,high)区间内
size=None 数组型状,默认只能生成一个随机值,类似前面的shape
dtype=None 元素类型b
特点:可以生成多维数组
常:
np.random.randint(0,100,size=6) 生成6个数的一维数组
np.random.randint(0,100,size=(6,5)) 生成6行5列的二维数组
np.random.randint(0,100,size=(6,5,7,8)) 生成四维数组(size/shape的()中有几个数就代表几维)
3.展现方式
1.print() 一般在numpy中不用这个
2.display() 跟print()差不多,但是在matplotlib画图展示的时候会更好看
4.四个重要属性
n.ndim 维度
n.shape 形状(各维度的长度) 重要,常用,其他了解即可
n.size 总长度
n.dtype 元素类型
5.基本操作
1.索引
1.一维
n1=np.arange(10,20) # array([10,11,12,13,14,15,16,17,18,19])
n1[3] # 13
n1[3],n1[-1] # (13,19)
2.多维
n2 = np.random.randint(10,30,size=(5,8)) # 5行8列的随机数组
n2[2] # array([27,10,29,19,27,29,17,11]) 取到第三行,得到一个一维数组
n2[2][-1] # 11 相当于在上面的一维数组中再取最后一个数(-1),得到11
可以简写为 n2[2,-1] # 11
2.根据索引修改值
1.一维
n1=np.arange(10,20) # array([10,11,12,13,14,15,16,17,18,19])
n1[3] = 9999
n1 # array([10,11,12, 9999 ,14,15,16,17,18,19])
2.多维
n2[2,-1] = 666
n2
3.切片
1.一维
n1[:] # array([10,11,12,13,14,15,16,17,18,19]) 相当于取全部的
n1[3:] # array([13,14,15,16,17,18,19]) 从第三个数开始取
n1[3:6] # array([13,14,15]) 从第三个数开始取,到第六个数(最后一个不包含)
2.多维
1.取行
1.取一行:索引(上述)
2.取连续/有规律的多行
n2 = np.random.randint(0,10,size=(5,8)) # 5行8列的随机数组
n2[:3] # 取到数组的前三行,得到的是二维数组
n2[3:] # 取第四行到最后的数组,得到的是二维数组
n2[::-1] # 行倒序 最后一行变第一行……以此类推
3.取不连续的多行:使用中括号
n2[[4,3,3]] # 取 第四行,第三行,第三行
4.总结:
取一行:索引
取连续/有规律的多行:切片
取不连续的多行:使用中括号(重点)
2.取列
1.取一列:索引
n2[:,3] # 取第三列 逗号是分隔维度的(重要)
2.取连续/有规律的多列:切片
n2[:,:3] # 取第一列到第三列
3.取不连续的多列:使用中括号
n2[:, [4,3,3]] # 取第四列,第三列,第三列
2.根据索引修改值
1.一维
n1=np.arange(10,20) # array([10,11,12,13,14,15,16,17,18,19])
n1[3] = 9999
n1 # array([10,11,12, 9999 ,14,15,16,17,18,19])
4.切片修改值
1.一维
n2[2:5] = 0
n2[2:5] = [666,777,888] # 三个索引对三个数,几个索引对应几个数(不能多/少)
n2[[1,3,4]] = 0 # 将第一三四行的数改为0
2.多维
n = array([1,8,-3,8,8,6,5])
i = np.argwhere(n == np.max(n)) # array([[1],[3],[4]]) 二维
n[i] = 0 # 会自动将n[[[1],[3],[4]]]化简
n # array([1,0,-3,0,0,6,5])
6.图片练习:把猫翻转
1.读取图片:
cat = plt.imread('文件路径.jpg') # 三维数组 array([[[……]]]) 有几个[]就代表几维
图片:
三维:彩色图片 (421,725,3) 图片中
3 :三色 即RGB
421 :行 即高度
725 :列 宽度
二维:黑白图片
2.查看数据形状
cat.shape
3.显示图片
plt.imshow(cat)
图片存储:plt.imsave(cat,'图片保存地址') # 要用自查
4.上下翻转 行交换
plt.imshow(cat[::-1])
5.左右翻转 列交换
plt.imshow(cat[:, ::-1])
6.第三个维度翻转(颜色 红色和蓝色交换,绿色不变 第一行和第三行交换)
plt.imshow(cat[:, :, ::-1])
7.裁剪
plt.imshow(cat[50:370, 110:600])
7.变形
reshape
n1 = np.arange(1,21) # array([1,2,……,20])
n1.reshape(4,5) # 将这个数组变成4行5列的数
n1.reshape(2,2,5) # 三维
一定要保证重塑后的行×列的数量跟之前的数量相等 比如现在的20个数分成4×5,不一样会报错
为了减少计算,可以写-1,-1代表剩余的维度,会自动匹配。一个reshape里只能有一个-1:
n1.reshape(4,-1)
n1.reshape(2,2,-1)
8.聚合操作(一维)
n1.sum()
np.min(n1)
np.max(n1)
np.mean(n1)
np.average(n1) # 不常用
np.median(n1) # 中位数
np.percentile(n1) # 百分位数
np.argmin(n1) # 最小值对应的下标 # 一般arg开头的都是取下标的
np.argmax(n1) # 最大值对应的下标
np.std(n1) # 标准差
np.var(n1) # 方差 = 标准差的平方
np.power(3,4) # 次方,次幂 3的4次方
3**4 # 更推荐使用这个 运行时间更短,书写简单
np.argwhere() # 按条件查找
n = array([1,8,-3,8,8,6,5])
np.argmax(n) = 1 # 最大值下标是1
n[np.argmax(n)] = 0 # 即 n[最大值下标]=n[1] = 0 就是把最大值下标的数据修改为0
argmax和argmin:
只会返回一个下标,只能找到一个
argwhere:
np.argwhere(n == np.max(n)) # array([[1],[3],[4]])
9.矩阵运算
1.矩阵积,矩阵乘(三种)
np.dot(n3, n4) # 行乘列相加,线性代数的算法(第一个矩阵的列数 等于 第二个矩阵的行数)
n3 * n4 # 但是n3、n4必须是同型矩阵
n3 * 10 # 矩阵乘以一个数
2.矩阵 和 数 数学运算
n + 10
n - 10
n * 10
n / 10
n // 2
n % 3 # 余数
n ** 3 # 次方
3.矩阵 和 数 比较运算符
n > 5
4.矩阵 和 矩阵 : 须是同型矩阵:行数和列数对应相等,但有特殊情况,在5中说明:广播机制
n3 * n4
n3 + n4
5.广播机制
1.尽可能扩展维度让2个矩阵变成同型矩阵
2.扩充维度的数据 会使用已经存在的数据
n1 = array([1,2,3])
n2 = array([[2,2,4],
[1,1,3]])
n1 + n2
会先将n1变成 array([[1,2,3],
[1,2,3]])
然后再加上n2 array([[2,2,4],
[1,1,3]])
得到 array([[3,4,7],
[2,3,6]])
3.但是不能扩展成同型矩阵的时候会报错
6.线性代数中其他矩阵操作
n = np.array([[1, 2, 3],
[2, 3, 4],
[4, 6, 7]])
3*3 方阵:行数==列数
阶数:3阶
提供线性代数的功能
np.linalg.det(n) # 行列式的值
行列式的值: 主对角线 - 副对角线
主对角线: 1*3*7 + 2*4*4 + 3*2*6 = 21+32+36 = 89
副对角线: 3*3*4 + 4*6*1 + 7*2*2 = 36+24+28 = 88
主对角线 - 副对角线 = 89 - 88 - 1
9.交换首尾两行
n1[[0, -1]] = n1[[-1,0]]
10.归一化
(n5 - min1) / (max1 - min1) # 得到[0,1]组合成的数据
'''