列表,简单却强大-Python基础连载(九)
开篇
我们已经学习了数字和字符串这两种数据类型,它们都有一个共同的特点,那就是一个变量只能存储一个数字或者字符串,如果有多个数字或者多个字符串,那就必须得用多个变量来存储。
比如,现在有'abc','d',1,123,那么想要存储这些,必须这样做:
1234v1='abc'v2='d'v3=1v4=123
当有成百上千甚至更多个待存储的元素时,显然需要的变量个数会非常多,过程会无比繁琐。
别担心!本期要学习的列表就是填补这一缺憾的,学完之后,你会发现,上面的过程只需写成如下一行代码即可:
1v=['abc','d',1,123]
是不是迫不及待了,那就开始吧!
初识列表列表用[]来包裹,[]内部可存放元素,这些元素之间用逗号,隔开。
举个栗子,现在需要统计一下“南极小学”六年级的5个班中,每个班打算今年暑假去南极旅行的人数,假设各班统计上来的人数分别是11,111,1234,2233,666,使用列表可以这样存储:
1num_go=[11,111,1234,2333,66 ...
Tensorflow中的高级操作
tf.gather可以实现根据索引号收集数据
假设有4个班级,每班35人,共8门课程的成绩
举几个栗子
它等价于
但是对于不规则(连续)的索引,还是tf.gather()更强大
通过组合多个tf.gather,可以实现复杂一点的功能
现在,想要抽查第 2 个班级的第 2 个同学的所有科目, 第 3 个班级的第 3 个同学的所有科目,第 4 个班级的第 4 个同学的所有科目
这个更复杂了
可以这样
然后用stack()合并
但是还有更好的方法,那就是tf.gather_nd
tf.gather_nd也是根据索引号收集数据,只不过比tf.gather更灵活些
继续上面的例子
变得简洁了,只需传入一个列表
再举个复杂点的栗子:选取1班的学生1的科目2、2班的学生2的科目3、班级3的学生3的科目4的成绩,共有3个成绩数据
tf.boollean_mask以掩码方式选取数据
这里的 tf.boolean_mask 的用法其实与 tf.gather 非常类似,只不过一个通过掩码方式采样,一个直接给出索引号采样
其实它也可以像tf.gather_nd那样,做多 ...
Tensorflow进阶
张量合并1.拼接
2.堆叠
无论哪种方式,相应维度必须一致
分割合并的逆过程
将1个张量拆成多个张量
1. split等份分割
不等份分割传入列表,表示分割后每一部分的长度
2. unstack
可以看出,stack是在合并张量时增加了维度,而unstack是在分割张量时减少了维度
【注意】unstack一定会将原张量按照axis指定的维度方向分割成全部的部分的长度都是1的张量,因为只有这样才能将shape中为1的维度方向去掉
范数主要使用L1范数、L2范数和无穷范数
常用统计量最值:tf.reduce_max、tf.reduce_min
均值:tf.reduce_mean
和:tf.reduce_sum
指定axis
不指定axis此时会对全局求解:
应用场景求解所有样本的平均误差:
在分类问题中,求解概率最大值所在下标,即label假设有两个样本,做10分类问题
使用tf.reduce_max只能求解最大值,而使用tf.argmax可以求解最大值所在索引号(下标)
所以,这两个样本所属类别分别为8和9
张量比较还是拿10分类的栗子,假设有100个样本
开始比较
计 ...
Tensorflow基础
Tensor是什么
张量的维度也称作轴 (Axis)
一般把标量、向量、矩阵也统称为张量
TF中的数据类型数值,布尔,字符串
1.数值类型
在tf中创建标量
使用.numpy可以返回Numpy.array类型的数据
在tf中创建向量
此时,必须使用List容器传值
在tf中创建矩阵
在tf中创建三维张量
2.字符串类型
不怎么用,Python内置的字符串方法已经足够
3.布尔类型
tf的布尔类型和Python内置的布尔类型不等价
类型转换numpy ==> tensor
一般的,使用cast函数可完成不同数据类型,数据精度之间的转换
int ==> bool
bool ==> int
待优化的张量对于一些需要训练优化的参数,可设置tf.Variable类型
比如神经网络中,输入的X不需要包装成该类型,而w和b需要
name和trainable是Variable特有的属性
创建张量从数组,列表中创建convert_to_tensor和constant作用一样,都是创建张量
创建全0或全1的张量标量
向量
矩阵
可以使用 ...
分支循环,效率加速器-Python基础连载(八)
开篇你可能已经发现,前面的七期内容有一个共同的特点,那就是偏向理论基础,似乎学完之后只是了解了一些实用的方法,比如字符串如何进行增删改查,如何交互实现输入输出,Python运算符的种类等等。
此刻的你,是不是一点也没有感受到程序带来的效率翻倍?
今天就来填补这个大坑,一起来学习分支和循环吧!
分支所谓分支,可以形象的理解为一棵树的分叉:
满足哪个条件,就往哪个分叉方向前进。
写成Python伪代码的格式如下:
这便是最简单的分支结构:if...else...
还记得之前讲的缩进吗?在这里,:之后按回车键就会自动缩进了,一个缩进相当于按一次Tab键
缩进的存在,使得Python代码的可读性更强。
再举两个栗子来练习一下,建议小白同学手动敲一遍:
【栗子1】数字比较
123456x=1y=2if x>y: print('x比y大!')else: print('x比y小!')
输出:
1x比y小!
【栗子2】年龄验证
1234567age=input('请输入你的年龄:')age=int(age)#input输 ...
小小运算符,构筑大世界-Python基础连载(七)
开篇本期将介绍Python的运算符。
在正式开始之前,应该给运算符下个教科书式定义:
1运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算(百度百科)
好吧,这定义越看越晕。不管他了,咱们直接开始,在实际操作中理解运算符!
需要注意的是,你如果见到x=x+1这种操作,千万不要把这与数学上的操作混为一谈。
前面也提起过,在数学上,x=x+1中的=是等于的意思,而在编程语言中,=是赋值的意思,将=右边的值赋值给=左边。
所以,x=x+1在数学上是不成立的,但是在编程语言中,是将变量x做了加1的操作。
算数运算符1. + :加法运算
2. -:减法运算
3. *:乘法运算
4. / :普通除法运算
5. // :整数除法(整除)运算
6. ** :平方运算,a**b代表求a的b次方
7. % :取余运算
上个栗子:
12345678>>> 1+12>>> 1-10>>> 1*22>>> 3/21.5>>> 3//21>>> 2**3#求2的3次方8>>> ...
跳动的数字,熟悉又陌生-Python基础连载(六)
开篇经过前面与字符串的相爱相杀,相信你已经初步掌握了字符串的基本用法。本期将开始学习一个新的数据类型:数字。
在初高中,你已经学习了整数,小数,复数,这些包含在今天要讲的Python的数字类型中,正如上图所示(注:在这里你可以先把浮点数理解成小数,这对于之后的编程几乎没有影响,但随着学习的深入,你可能会发现这种理解是片面的)。
下面来逐个击破~
int & float这两种类型不用多说,你已经与它们打了多年的交道了。
还记得之前讲过的type()函数吗?它可以用来查看一个变量所属的数据类型。
嗯,意料之中。
在一些其他编程语言,如C语言中,\代表的是整除,比如3/2=1而不是1.5。
以前的Python2也这样干过,但是在Python3中(本系列教程一直在用的Python版本是Python3,还记得第一期的环境搭建内容吗?),这一规则被更改了,更改后的规则也许更符合大众的逻辑:
\代表我们所认知的普通除法,\\代表整除。
上个栗子:
bool布尔类型(bool)只有两种取值,True和False
你可能产生疑惑,这是哪门子数字类型啊?这不是英文单词吗!
首先用一个栗子反驳 ...
输入输出,字符串如影随形-Python基础连载(五)
开篇前面两期详细的介绍了字符串及其相关操作,在今后的编程中,你将经常和字符串打交道。一个比较常见的场景就是输入输出,所以本期将结合字符串,讲述最基本同时也是最常用的输入输出语法(input和print),并且会在文章最后补充一些之前没有讲到的字符串的内容。
input()用于接收用户的输入input()用于接受用户的输入。
1>>> input()
当你写入以上代码,并按下回车键后,你会发现光标在闪动,这是在提示你要输入一些东西。
当输入完成后,再按一次回车,你所输入的东西便会打印出来显示在屏幕上,就像下面这样:
图中,黑色的字是我输入的,蓝色的字是打印输出在屏幕上的。
那如果不想打印输出在屏幕上,而是想将输入的内容保存起来,又应该怎么做呢?
简单!只要用一个变量接收input()的输入内容就搞定啦!
这样,输入的内容就被保存在变量x中了。
细心的你或许已经发现了,蓝色的字被一对''包裹着,这不正是之前学习的字符串类型吗?
没错!事实上,你输入input()中的任何类型的数据,都会变成字符串类型。
你可能不太信,因为上面的栗子中,我输入的内容我 ...
纵经千万次增删改,初心永不变-Python基础连载(四)
开篇上一期介绍了字符串及其切片用法,相信你已经掌握。
那么这一期,我们就来学习一下字符串的增删改查等一系列方法,正是因为有了这些方法,你才能像呼吸一样自然地操作字符串。
需要指出的是,字符串是不可变类型,也就是说,只要一个字符串确定了,那么任何操作都不能修改该字符串。
此时的你,可能会很疑惑:既然字符串是不可变类型,那何来增删改这些操作呢?
解答这个问题的过程涉及到了内存,下面我将用画图的方式解释:
将内存看作一个大房子,房子中有许多小房间(地址单元),将它们分别编号为0,1,2,3。
在运行s='great'这一句代码时,会给变量s分配一个房间,假设分配的房间号是0:
现在,我想要修改变量s中的内容,由great改成gre!。由于字符串是不可变数据类型,所以不能直接在变量s所在的小房间(地址单元)内进行修改。
正确的做法是新开一个小房间,假如新开的小房间是1号,则首先会将s的前3个字符复制到房间1(这里用到了切片,你还记得吗),然后在后面加一个!。这样,房间1内所保存的就是我们想要的结果了。
以上文字描述过程对应代码如下:
1234>>> s=& ...
切片,灵活的字符串-Python基础连载(三)
开篇之前已经提到过,在Python中,一共有六大数据类型
本期就开始学习Python的六个标准数据类型中的字符串。
什么是字符串在Python中,字符串是用一对引号(单引号/双引号均可)包裹起来的一串字符,比如之前你见到的'Hello World !'便是一个字符串。
下面再给出几个字符串的栗子:
Python提供了type()函数用于查询某个变量的数据类型,在上图中,数据类型名字后面的英文就是该数据类型所对应的type()函数返回值,()内填写的是你要查看的变量名。
接着上面的栗子,现在我要查看一下这些变量所保存元素的数据类型(不能你说是字符串就是字符串吧,我要亲自动手验证一下,嘿嘿)
验证完毕,返回值是*str*,是字符串无误!
注意,一个单个的字符也是字符串:
123>>> ch='u'>>> type(ch)<class 'str'>
你可能会好奇,这里出现的函数,返回值和class是什么鬼。不要着急,后面会讲到,现在你只要会用type()来查看一个变量的数据类型就达 ...