我的python学习之numpy学习笔记

我的python学习之numpy学习笔记

前言部分(可忽略)

本人于2020年2月疫情爆发阶段开始正式学习python,之前使用的是Sublimeb text做笔记,然后在pycharm上,python3.7的环境下进行运行,进一步接触python后发现TensorFlow等很多需要python3.6环境下,所以就改用python3.6。我也不能说明白python版本之间的差别,说实话,我就是菜鸟级别的,跟其他新手一起抱团努力而已,希望我们能一起在python学习的道路上,共同进步。以下是我的学习笔记,主要是代码+注释+总结+罕见的几句吐槽。

正文部分

接下来就是这个文章的重点啦,第一简单讲一讲numpy是干啥的,是处理矩阵的,矩阵有哪些相关的操作呢?

一、简单创建(就是弄出来一个矩阵)

你可能不太懂维度是什么意思,请回顾:x轴叫一维坐标系,x、y轴叫二维坐标系,还有啥问题,百度一下都能解决哒。

import numpy as np
array = np.array([[1,2,3],
                  [4,5,6],
                  [7,8,9]])  # 这是一个二维矩阵
print(array)# 本身 [1 2 3]
            #      [4 5 6]
            #      [7 8 9]
print(array.ndim) # 维度 2(二维矩阵)
print(array.shape) # 形状(3,3)
print(array.size) # 大小 6
print(array.dtype) # 元素类型 int 32
二、略微复杂创建

不是自己一个一个将数值输入进去的创建方法了,应该也不难理解。步长为3的意思就是1、4、7、10这样一直加3的这样的操作。

import numpy as np

a = np.array([1,2,3],dtype = np.int32)
print(a.dtype)
b = np.array([1,2,3],dtype = np.float)
print(a.dtype)
c = np.array([1,2,3]) # 定义一维数据
print(c)
d = np.array([[1,2,3],  # 定义二维矩阵
              [4,5,6]])
print(d)
zero = np.zeros((2,3)) # 生成一个两行三列都是0的矩阵
print(zero)
one = np.ones((3,4)) # 生成一个三行四列都是1的矩阵
print(one)
empty = np.empty((3,2)) # 生成一个三行两列的矩阵 所有数接近0却不等于0的数字
print(empty)

e = np.arange(10) # 生成一个从0到9的一维数组
print(e)
f = np.arange(4,12) # 生成一个从4到11的一维数组,跟for i in range(...)一样
print(f)
g = np.arnage(1,20,3) # 从1到19,步长为3的一维数组
print(g)
h= np.arange(8).reshape(2,4) # [[0 1 2 3]  重新定义矩阵的形状
print(h)                     #  [4 5 6 7]]

三、基本运算

下面就是一些运算,包括位置对应的加减乘除和标准的矩阵相乘,这个部分记住i就好了,没什么为什么了吧应该。

import numpy as np
arr1 = np.array([[1,2,3],
                 [4,5,6]]) 
arr2 = np.array([[1,1,2],
                 [2,3,3]])
print(arr1 + arr2)
print(arr1 - arr2)
print(arr1 * arr2) # 结果就是按位相乘
print(arr1 ** arr2) # "**"是指按位乘方
print(arr1 / arr2) # 按位相除
print(arr1 % arr2) # 按位取余
print(arr1 // arr2) # 按位取整
print(arr1 + 2) # 所有元素加2
print(arr1 * 10) # 所有元素乘以10

arr3 = arr1 > 3 # 做判断
print(arr3) # 得到一个bool类型的矩阵
arr4 =np.ones((3,5)) #三行五列的元素为无限接近1的矩阵
print(arr4)

print(np.dot(arr1,arr4)) # 真正的矩阵的乘法
print(arr1.dot(arr4)) # 矩阵乘法方法二
print(arr1.T) # 转置矩阵
print(np.transpose(arr1))  # 转置矩阵方法二
四、特殊运算

求随机值、最大值、最小值这些操作,虽然英文大家基本都看的懂,但是需要有一些基础的人看才行的。自己编了一个小口诀:axis一横,什么意思呢?就是中文一是水平的,所以表示axis=1都是横向(水平)方向的操作,包括后面所有操作。

import numpy as np
sample1 = np.random.random((3,2)) # 生成三行两列的,从0到1的随机数
'运行的时候,发现自己丢了一个random,居然两个放一起!!'
print(sample1)
sample2 = np.random.normal(size=(3,2)) # 生成三行两列符合标准正态分布的随机数
print(sample2)
sample3 = np.random.randint(0,10,size=(3,2)) # 生成三行两列从0到10的随机整数,我猜随机浮点数是ranfloat,运行时候试试
print(sample3)

print(np.sum(sample1)) # 求矩阵中所有元素之和
print(np.min(sample2)) # 求元素中最小值
print(np.min(sample3)) # 求元素中最大值
print(np.sum(sample1,axis = 0)) # 对列求和
# 结果array([1.87... , 1.64... ])
print(np.sum(sample1,axis =1)) # 对行求和
# 结果array([1.03... , 1.18... ,1.30...]),因为是随机数,值没意义,主要是行求和后竟然是一维数组
print(np.argmin(sample1)) # 求最小值的索引,就是从左往右,从上到下,从0开始的,相当于数组下标
print(np.argmax(sample1)) # 意思略。  arg搜了一下是变量的意思,翻译过来是变量最大/小值,我说咋不是arrymax的呢
print(np.mean(sample1)) # 求平均值
print(sample1.mean()) #求平均值方法二
print(np.median(sample1)) # 求中位数
print(np.sqrt(sample1)) # 各自求平方根
print(np.sort(sample1)) # 每行排序,从小到大

sample4 = np.random.randint(0,10,size=(1,10)) # 生成一维数组
print(sample4)
print(np.clip(sample4,2,7)) # 所有数小于2的数变成2,大于7的数变成7
五、输出矩阵

这个就不是一般的输出了,挑着输出,比如输出从第二个到倒数第一个,这里有一个意识必须明白,计数是从0开始的,也就是说,从第二个到倒数第一个的意思是例如,0、1、2、-2、-1、0。“1”就是第1个,“-1”就是倒数第一个,很奇怪吧,但是我觉得我这个例子还是挺有助于理解的。

import numpy as np
arr1 = np.arange(2,14)
print(arr1)
# [ 2 3 4 5 6 7 8 9 10 11 12 13 ]
print(arr1[2]) # 相当于数组 a[2],也是从0开始的
print(arr1[2:-1]) #从第二到倒数第1(还有倒数第0的)的位置
# [ 4 5 6 7 8 9 10 11 12]
print(arr1[:5]) #前5个数据
print(arr1[-2:] # 最后两个数据
# 总结一下,冒号前面是开始位置,后面是结束位置,正数是正过来从0开始数,负数是反过来从0开始数,依然是左闭右开,左边算,右边不算

arr2 = arr1.reshape(3,4)
#[[ 2 3 4 5]
# [ 6 7 8 9]
# [10 11 12 13]]
print(arr2)
print(arr2[1]) # 输出第一行(这个一是从0开始算)
# 结果[ 6 7 8 9]
print(arr2[1][1]) #输出第一行第一列的值(,从0开始的行和列。经常提醒以后就不说了)
print(arr2[1,1])  #与上面一行同样的结果
print(arr2[:,2]) # 用冒号表示所有的行,,[1,2]第一行第二列,[:,2]所有行第二列
# 效果[4 8 12]
for i in arr2:  #迭代行
    print(i)
# 会一行一行的输出

for i in arr2.T: # 通过转置矩阵进行列迭代
    print(i)

for i in arr2.flat: # 一个一个的输出
    print(i)
六、矩阵的合并

合并,大家看见文字就懂得其中的含义了吧,这里需要“一横”口诀哦

import numpy as np

arr1 = np.array([1,2,3])
arr2 = np.array([4,5,6])
arr3 = np.vstack((arr1,arr2)) # 垂直合并,注意是个双层括号
print(arr3)
print(arr3.shape)

arr4 = np.hstack((arr1,arr2)) # 水平合并,同上
print(arr4)
print(arr4.shape)

arrv =np.vstack((arr1,arr2,arr3)) # 多个也可以垂直合并,只要列数相同,加个逗号可以继续写
print(arrv)
arrh = np.hstack((arr1,arr2,arr4)) # 同理,行数相同
print(arrh)

arr = np.concatenate((arr1,arr2,arr1)) # 没有写行还是列的话默认变成一维数组,从左往右一一作为新数组的元素
print(arr)
arr = np.concatenate((arr3,arrv),axis=0) # 合并的array维度要相同,array的形状要匹配,axis=0.纵向合并
print(arr)
arr = np.concatenate((arr3,arr3),axis=1) # 同理,水平合并
print(arr)

arr1 = np.array([1,2,3])
print(arr1)
print(arr1.shape) # (3,)是一维数组的特殊形式
print(arr1.T)# 注意:一维的array不能转置
arr1_1 =arr1[np.newaxis,:]# newaxis:新增一个维度
print(arr1_1) # [[1 2 3]]
print(arr1_1.shape) # (1, 3) 表示一行
print(arr1_1.T)# 这样就能
arr1_2 = arr1[:,np.newaxis] # 新增加的维度在列这个位置
print(arr1_2)
print(arr1_2.shape)
# 总结:arr[ , ] 逗号前表示行,逗号后面表示列,newaxis表示增加一个维度,对应另一边补: 查阅资料后,等价于写一个None
arr1_3 = np.atleast_2d(arr1) # 2d表示二维,至少二维(二维及以上不变,一维的话就会变成一个二维数组 
print(arr1_3)
print(arr1_3.T)
七、矩阵的分割

分割就是你想象中的切蛋糕一样切下来,但只能横着切,竖着切,因为斜着切没意义的缘故吗?可能等待大佬去开发,我觉得斜着切很酷!

import numpy as np
arr1 = np.arange(12).reshape(3,4)
print(arr1)

arr2,arr3 = np.split(arr1,2,axis=1) # 水平方向分割成两份
# arr2,arr3分别被赋予 arr1被切分成两个部分,从列的方向切割,如果不对应的话就会出错
print(arr2)
print(arr3)
arr4,arr5,arr6 = np.split(arr1,3,axis=0) # 垂直方向分割三份,理解方法同理
print(arr4)
print(arr5)
print(arr6)

arr7,arr8,arr9 = np.array_split(arr1,3,axis=1)# 水平方向分割,分成三份(不等分割
print(arr7+'\n'+arr8+'\n'+arr9)
# 结果是arr7分到了前两列,arr8,arr9为后两列

arrv1,arrv2,arrv3 = np.vsplit(arr1,3) # 垂直分割成三份
print(arrv1+'\n'+arrv2+'\n'+arrv3)
arrh1,arrh2 = np.hsplit(arr1,2) #水平分割成两份
print(arrh1+'\n'+arrh2)
八、矩阵的拷贝

以前我就觉得喊拷贝的人很奇怪,我都叫“Ctrl C一下"或者"复制一下",感觉用“拷贝一下的都很厉害”。

import numpy as np 
arr1 = np.array([1,2,3])
arr2 = arr1 # arr1,arr2共享一块内存(浅拷贝)
arr2[0] = 5
print(arr1+'\n'+arr2)
arr3 = arr1.copy()
arr[0] = 10
print(arr11+'\n'+arr3) # arr3和arr1不无关了(深拷贝)

以上就是所有内容。谢谢大家居然看到了最底下,感谢各位。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值