作者将自己学习numpy的代码+笔记分享一下,想学哪一部分就把哪一部分的注释去掉即可,便于初学者学习和复习:
- import numpy as np
-
- '''主要是根据数据构建算法可能用到的矩阵,对于矩阵可以进行相应的处理变换'''
-
- #将一个列表输出成一维向量,列表的列表输出为矩阵
- # The numpy.array() 可以将一个列表输出成一维向量 列表的列表输出为矩阵(即上面说的ndarray)
- vector = np.array([5, 10, 15, 20]) # 一维向量(当然也是矩阵)
- # 矩阵,矩阵中的列表值必须为相同类型,只要有字符,就全变为字符,如果有True,就定义为1
- matrix = np.array([[5, 10, 15], [20, 25, 30], [35, 40, 45],[33,22,33]])
- # print(vector)
- # print(matrix)
- # #
- # print(vector.shape) #(4,)
- # # .shape输出矩阵维度
- # print(matrix.shape)#(4, 3)表示四行三列
-
-
- # print(matrix[:,1])#取所有行的第2列
- #
- # vec_equal_to_ten=(vector==10)
- #
- # #找到矩阵中有没有值等于一个数,返回的是含有布尔值的列表
- # print(vec_equal_to_ten)
- #
- # #输入有10的那一行,在一维向量中,每一个数都是行
- # #这个可以检查所有数中有没有该值,没有的话就返回[],比True和False快速
- # print(vector[vec_equal_to_ten])
- #
- # #检查矩阵中所有行的第二列是否有等于25的,如果有就返回该行
- # matrix_second_col_25=matrix[:,1]==25
- #
- # print(matrix[matrix_second_col_25])
- #
-
- # #与或表达式
- # vec_equal_to_ten_or_five=(vector==10)|(vector==5)
- # print(vector[vec_equal_to_ten_or_five])
-
- # #改变所有值的操作,不改变原来矩阵的类型
- # vec=vector.astype(str)#把矩阵中所有元素变成字符串,但是不改变矩阵结构
- # print(vec)
- # print(vector)
-
- # #生成0~14组成的向量
- # m=np.arange(15)
- # print(m)
- # print(m.reshape(3,5))#一共15个向量,将向量变成3*5的矩阵
- #
- # # #形状,元素个数,数据类型名称,维度:一般都是二维矩阵
- # print(m.shape,m.size,m.dtype.name,m.ndim)
-
- # # 注意zeros()中需是一个元祖
- # print(np.zeros((3, 4))) # 默认float类型
- # # 三维矩阵(每个元素都是整数1),两?三行四列,高维不知道怎么说
- # print(np.ones((2, 3, 4), dtype=np.int32))
- #
- # print(np.arange(10, 30, 5)) # 10开始<30结束,每5个取一个值
- #
- '''默认从0到1产生随机数,产生二行三列的数组'''
- # print(np.random.random((2,3)))
- ##返回一组具有标准正态分布的样本
- # print(np.random.randn(2,4))
-
-
- # #这个pi必须要说明是从numpy引入的,否则当作变量处理
- # from numpy import pi
- # # 起始0到2*pi平均取100个值
- # print(np.linspace(0, 2 * pi, 10))#是平均取值
-
- # a = np.array([20,30,40,50])
- # b = np.arange(4)
- # # b**2表示矩阵所有元素平方
- # print(b**2)
- # # a<35表示对矩阵所有元素判断,每个元素都返回布尔值
- # print(a<35)
- #
- # '''A*B表示AB矩阵的元素本身相乘
- # 而A.dot(B)/np.dot(A,B)是AB两个矩阵做矩阵乘法运算'''
- # print(b)
- # # 求指数幂
- # print(np.exp(b))
- # # 开方
- # print(np.sqrt(b))
-
- # a = np.floor(10*np.random.random((3,4)))# floor函数表示向下取整
- # print(a)
- # print("--------------------------------")
- # # ravel函数把矩阵拉成一个向量
- # print(a.ravel())
- # print("--------------------------------")
- # #注意a.shape()是永久改变数组结构,而reshape函数不改变
- # a.shape = (6,2)
- # # a.reshape(3,-1) 当行或列确定后,另一个可以置为-1,它自己会算出正确结果
- # print(a)
- # print("--------------------------------")
- # # 转置
- # print(a.T)
-
- # a = np.floor(10 * np.random.random((2, 2)))
- # b = np.floor(10 * np.random.random((2, 2)))
- # print(a)
- # print("--------------------")
- # print(b)
- # print("--------------------")
- # # 横着拼接
- # print(np.hstack((a, b)))
- # print("--------------------")
- # # 纵着拼接
- # print(np.vstack((a, b)))
-
- '''np.hsplit(a,(3,4)) 是一个 numpy 函数,它用于沿着水平轴(列)将数组 a 分割成多个子数组。在这种情况下,它将在第3列和第4列之后分割数组 a。
- 这意味着,它将返回三个子数组:第一个包含前三列,第二个包含第四列,第三个包含剩余的列1。'''
- # a = np.floor(10*np.random.random((2,12)))
- # print(a)
- # print("--------------")
- # # 按行切分 ,切成3份
- # print(np.hsplit(a,3))
- # print("--------------")
- # # 指定位置切分
- # print(np.hsplit(a,(3,4)))
- # b = a.T
- # print(b)
- # print("--------------")
- # # 按列切:vsplit是横着切,hsplit是竖着切
- # c=np.vsplit(b,3)
- # print(c)
-
- '''a=b地址赋值,深复制
- a=b.view()只是指向不同,但是值居然是共用的
- a=b.copy()指向不一样,值也不一样,推荐使用这个copy()'''
- # a = np.arange(12)
- # # a和b指向同一个东西(只是名字不同)
- # b = a
- # print(b is a)
- # print(b.shape)
- # print(a.shape)
- # print(id(a))# 对应内存上唯一的一个区域
- # print(id(b))
-
- '''提取每列最大最小值,其实也可以提取每行的最大最小值'''
- # # 这些元素是从0到19的整数的正弦值,其实就是对于矩阵的运算,几乎都是对矩阵元素进行的变换
- # # 所以就是将这个矩阵中的元素求sin值
- # data = np.sin(np.arange(20).reshape(5,4))
- # print(data)
- # # 使用 argmax 函数沿着第0轴(即行)找到每一列的最大值的位置(即索引)。这些索引存储在名为 ind 的数组中。
- # ind = data.argmax(axis=0)
- # print(ind) #该位置索引从0开始
- # # 通过ind 取出每列对应的最大值,data.shape在本例中是(5,4),所以data.shape[1]就是4
- # data_max = data[ind, range(data.shape[1])]
- # print(data_max)
- # # 既然0轴是挑选每一列的最大值,那么1轴我猜就是挑选每一行的最大值,甚至我猜有argmin函数
- # inr = data.argmax(axis=1)
- # print(inr)
- # data_max1 = data[range(data.shape[0]),inr]
- # print(data_max1)
- # # 列的最大值,索引就在行的位置,因为列已经固定了,索引变化的是行
- # # 行的最大值,索引就是列的位置
-
-
- '''数组扩展(其实就是生成一个新的矩阵,矩阵中的元素就是该数组的复制粘贴),matlab中也有类似的操作'''
- # a = np.arange(0, 40, 10)
- # print(a)
- # # 扩展a(扩展两行三列)
- # b = np.tile(a, (2,3))
- # print(b)
-
- '''每行排序,也可以返回对应关系的索引'''
- # a = np.array([[4, 3, 5,],
- # [1, 2, 1]])
- # print(a)
- # print("--------------------")
- # # 按行排序(每行从小到大排)
- # b = np.sort(a,axis=1)# 其实本质上来说,axis横轴纵轴就是指示了处理数据的方向
- # #因为处理数据的方向是纵轴方向,所以在纵轴上点一个,就是处理一行,再往下点一个,就是继续处理下一行
- # print(b)
- # print("--------------------")
- # print(a) #验证a矩阵是否改变,结果是不变
- # print("--------------------")
- # a.sort(axis=1) #对a矩阵每行从小到大的排序将永久赋值到a
- # print(a)
- # print("--------------------")
- # a = np.array([4, 3, 1, 2])
- # # 返回从小到大的数据对应的索引
- # j = np.argsort(a)
- # print(j)
- # print("--------------------")
- # print(a[j])# 通过索引取出值