搞AI,除了理论,还要当个调包侠。不动手怎么行呢,这也不会,那也不会。
pycharm+anaconda安装(官网),在anaconda里进入terminal,下载python,需要换源(比较快)然后装一些没有的库(视项目文件需要而下载)
然后在pycharm中建立工程,建立.py文件,在File菜单下settings,在project下project Interpreter(解释器)里add(右边齿轮)anaconda里刚下载好的python。(不是新建环境,而是存在的环境,解释器选…/anaconda/envs/tools/python.exe,自动会有一个conda依存,目录为…/anaconda/Scripts/conda.exe。勾上最后一个选项。(之前一直选envs/tools/目录下的conda,没有找到)(scripts目录里找python,也是自己智障了)
这样做可以很方便的管理python版本。
没有的东西嘛,pip(or pip3)(同linux里的install)安装。
其实之前也有下载一个普通的python的IDE3.7.4,但是那个只有对应的版本。打开的时候是shell界面,只能写一句enter解释一句;在file里创建一个文件之后,就能写很多行了。
言归正传,pycharm里也能写shell,在左下角里点terminal,输入python(或者python3?)进入shell,写一句解释一句,其实在学习初期用这种方式还是比较舒服的。(写成文件的话,每次要print才能看到内容)
跟着链接里的练习咯。其实做AI主要还是调包不是咯,python够调包就行,很多讲python(或者讲numpy)的也没这个好——对于纯新手。
AI学习基础-numpy入门
想多了解下python的话可以看这个PDF。
AI基础-python入门
以下为练习:初始化数组,以及数据类型
>>> np.arange(1,20,8)#1-20之间,每隔8,生成一个有序一维数组
array([ 1, 9, 17])
>>> np.arange(1,20,5)
array([ 1, 6, 11, 16])
>>> np.arange(12).reshape(3, 4)#在0-12内
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> np.zeros((2,3))#创建一个2行3列的数组,其值全0
array([[0., 0., 0.],
[0., 0., 0.]])
>>> np.ones((3,4))#创建一个3行4列的数组,其值全1
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
>>> np.empty((5,2)) #生成一个五行二列的数组,其值无限趋近于0
array([[6.95251225e-310, 1.07378333e-311],
[1.07376636e-311, 0.00000000e+000],
[0.00000000e+000, 0.00000000e+000],
[0.00000000e+000, 0.00000000e+000],
[0.00000000e+000, 0.00000000e+000]])
>>> data=np.array([1,2,3])
>>> data.dtype #查看数据类型
dtype('int32')
>>> f=data.astype(np.float32)#转换数据类型为32位浮点数 #可用于证明低精度数值不影响学习结果
>>> f.dtype
dtype('float32')
以下为练习:向量化(矩阵运算,线性代数)
数组的重要性在于,我们不用编写循环就可以对数据执行批量运算。也就是矢量化。在大小不同的数组之间的运算叫广播。
>>> d1=np.array([[1,1,1],[1,1,1]])
>>> d2=np.array([[2,2,2],[2,2,2]])
>>> d1+d2
array([[3, 3, 3],
[3, 3, 3]])
>>> d1*d2
array([[2, 2, 2],
[2, 2, 2]])
>>> d1/d2
array([[0.5, 0.5, 0.5],
[0.5, 0.5, 0.5]])
>>> d1.T #转置
array([[1, 1],
[1, 1],
[1, 1]])
>>> d1*0.5 #广播:将标量0.5和数组每个数相乘
array([[0.5, 0.5, 0.5],
[0.5, 0.5, 0.5]])
有关数组的更多信息可以看这个:数组
a=np.array(2,3)和b=np.array(3,2)是不能相乘的。
c=np.dot(a,b)是可以的
最近需要用脚本写Verilog文件。无奈作死在电脑上开了第二个账户(这样以前很乱的桌面就没有了,崭新的世界–同时很多配置也没有了,pycharm,anaconda的虚拟环境也变成了未激活)
为了将python设置成环境变量,四处寻找秘法。anaconda下载及python环境变量设置中所言,在path里添加各种路径,还是无效。
最后发现,居然是anaconda下载的python的虚拟环境没有激活,所以导致网上的各种良方都没有作用。激活之后,加上环境变量,可以随意用python写脚本了,汗!
感谢下面这位小哥的conda python安装
由于使用的notepad++编辑器,需要段注释,所以学习了一下。
单行、多行注释 #方式 :ctrl+k
取消单行、多行、区块注释 :ctrl+shift+k
区块注释或取消 #方式 :ctrl+q
顺便写一下pycharmIDE,段注释:
ctrl+/
1.首先我需要使用python的函数,创建了一个Func.py的文件,向里面写入:
def Add(x,y): #冒号!语法规则
z=x+y
a=z
return z,a
在另一个脚本test.py:
from Func import Add #从自建的Fun库里调用函数(不需要输入参数)
x=Add(3,5)
print(x)
在test.py文件的目录下用cmd执行该文件:python test.py
结果是(8,8),结果正确,但是返回的是元组而不是两个单独的数字。
python中需要注意:函数必须先定义、后调用(函数调用函数例外)。
函数输入变量为自定义的字符时,记得双引号:‘ 字符’
自学测试完毕,开始下一步。
2.创建文件(有b.v这个文件的时候,自动覆盖其内容)
file=open('./b.v','w') #生成文件
file.write('hello')
file.close()
打开文件(没有b.v这个文件的时候会报错)
file=open('b.v','w') #生成文件
file.write('hello1')
file.close()
注意print()打印变量和file.write(’{list}’)
write()函数里只能用字符类型,用于编码内容**。如何写入变量?** file.write(f ’ {变量} ’ )
write()模式’a’,代表追加模式’a’,可以实现多次写入。即每次执行都会在上一行的基础上,换行写入。还有一个模式,在’w’写入模式下,当我们下次写入变量时,会覆盖原本txt文件的内容
在python里,打印字符需要用print(‘hello’) ,而不是print(“hello”),和C有区别。
3.python中需要注意:小括号,中括号,花括号意义不一样
4.python没有switch-case。
python的if-elif-else语句:
5.对于python能自己定义数据类型,所以不经意间有些数据和自己想的不一样,会造成数据的误差甚至错误(习惯了verilog和C的变量定义,都是在算整数,突然来了个float让结果出错,懵了)
强制数据转换:
x=int(x)
int(x [,base ]) #但是我的编译器报错!只能用上面的形式
6.跨文件的全局变量(只有自己写一个py文件,原本没有这种用法)
debug方法:print!直接在有问题的地方插入,或者直接进入cmd,python脚本(shell)模式。
debug记录
float精度对结果的影响
cs和cx变量混淆。(由于case,多次复制,更改格式)
其实上一跳和下一跳都一样。1的右边是2,无论是1到2还是2到1,右边都是2。本来打算得到一个值,能方便放在变量里作为RTL的连线。但是这样得到的值,好像永远都不能满足要求?罢了,白写了一个函数。
7.python 特别喜欢
冒号,缩进
最后:
python制作verilog代码
Scipy(科学计算库)
数据可视化简易入门
class
属性引用的语法:obj.属性
类实例化的语法:obj = 类名()
类中方法的调用:obj.方法名()
class里的self相当于一个形参,在多次实例化的时候,分别成为那个实例化的变量(复用)
继承:父类:class A:
子类:class B(A): #从A继承而来
import 模块名1 [as 别名1], 模块名2 [as 别名2],…: (可以不用as后面的部分)使用这种语法格式的 import 语句,会导入指定模块中的所有成员(包括变量、函数、类等)。不仅如此,当需要使用模块中的成员时,需用该模块名(或别名)作为前缀,否则 Python 解释器会报错。
from 模块名 import 成员名1 [as 别名1],成员名2 [as 别名2],…: 使用这种语法格式的 import 语句,只会导入模块中指定的成员,而不是全部成员。同时,当程序中使用该成员时,无需附加任何前缀,直接使用成员名(或别名)即可。
python之多线程
python界面 | 实战Tkinter图形界面开发
涵盖库,查指令:菜鸟教程
Canvas语法格式
#创建画布
canvas = Canvas ( master, bg='white',
width=200, height=200,
option=value, ... )#master为self或tk( tk=Tk() )
#画线
line = canvas.create_line(x0, y0, x1, y1, ..., xn, yn, options)#option为长宽颜色等可选项
# 创建一个矩形,坐标为(10,10,110,110)
rectangle1=canvas.create_rectangle(10,10,110,110)
#插入图像
filename = PhotoImage(file = "sunshine.gif")
image = canvas.create_image(50, 50, anchor=NE, image=filename)
#更新画布
canvas.pack()
1.pyhton数据类型:元组(类似ROM,只能写一次)列表(类似数组,不过是一维的)np数组 字典(需要一个关键词去寻找,这个关键词为字符型,不可能用变量作为字典关键词)
可以用print(type())去查看数据类型。类型不同时,if等判断条件无效。
set={1,2} #不支持索引
list=[1,‘2’]#支持索引,和一维数组差不多
2.定义list[1]表示只有一个元素,访问时只能用a=list[0](不能用1,计算机的第一个 都是从0开始的)
numpy 定义的数组也一样
list[0]表第一个
list[0:6]表示第1-6个(6以前)
list[6:12]表示7-12个
list[1:]表示第1个-末尾所有
将list里的字符转换为int类型:(从txt里读入的数据都是str类型,需要转化)
data=['1','2']
data=list(map(int,data))#将列表的字符转化为int
但是如果txt里有回车,按行读取的话列表会有空格,转化失败(空格不是字符型),先去掉空格:
while ' ' in all_data:#除去空格,有空格下一步无法执行(比如某行为空的话)
all_data.remove(' ')
all_data=list(map(int,all_data))#将列表的字符转化为int
先定义一个list的长度(全局),用list作为函数入口参数时,长度可能不一致(元素为空格不计入?不清楚),导致……报错
while(cnt<10):
if cnt==4:
task_agent()
continue#break直接跳出while
else :
cnt += 1 # 不能只放if或else里
4.去除空格,不然把列表的值赋给np数组时 老是报错
temp_data=temp_data.strip()#除去空格
temp_data=int(temp_data)#list类型为str,存入np可能会有问题
Router_table[Router_ID,i]=temp_data #最后np还是把元素变成float类型了
5.伪静态变量。C有static,python没有。如果每次进函数的时候都cnt_r=0,肯定不行。那么把他当成全局变量,定义的时候初始化cnt_r=0,每次进入函数cnt_r就不会被重置了。
cnt_r=0#全局变量
def get_data(all_data,cnt):
global cnt_r
if((cnt-1)%5==0) and (cnt!=1) :#agent会跳过一个cnt不取值,cnt=5时又不会进入这个函数。只能cnt=6时-1
cnt_r+=1
CNT= cnt-cnt_r #消除agent计算时浪费的1clk
6.python无&& 只有and
7.没事就上百度,print找找变量的问题。不过应该有更简单的方法(像MATLAB一样监控变量)
8.用元组构造列表,列表名是变量
g_list={}
for i in range(Qsize):
g_list["router_table"+str(Router_ID)]= table #构造不同的列表名
if backx and backy and backz =='ok':#得不到正确的结果
if backx =='ok' and backy=='ok' and backz =='ok':
pip是不可能了,老是报错(读超时)还是去网站上下载把。Matplotlib下载网址
cp37是Python版本3.7。
算了还是换源pip把,太慢了。换源后起飞,不过安装最后出了问题,不信任换的源,解决办法解决办法
热力图
借鉴大佬代码
其中的直方图很nice。
将当前空间拆分建立新的子图,子图个数为四,按照2x2矩阵排列方式进行,当前子图为四个子图中的第一个:(以创建多个3D图)
ax = fig.add_subplot(2, 2, 1, projection='3d')
如果已经有一个主main了,会调用模块1.py(1.py会调用main.py),
你又新写了一个模块2.py(需要调用1.py),那么会报错。因为2在运行的时候调了1,1调main,main又调1,关系复炸了。
最近在参加中兴算法大赛,选的迪杰斯特拉派,求网络均衡,题目太繁琐,望而生畏劝退一拨人。后来题目组的大佬们又是调整题目,又是分享题目思路,给很多测试例子。这不,群内从300=>700+。我一菜鸡。
咳,正传。
处理官方给的测试用例 test.txt,着实不容易,要读入站台人员信息,轨道信息,货物信息,一共5000行+,每一行得到之后都要处理,这离不开split()、replace()等等函数。
顺便学习了一波join。join和split相反,合成字符串
数据结构也是硬伤啊,一共需要哪些东西,对事物建模,然后抽象出变量,变量名,整个系统如何运作。
迪杰斯特拉、ksp、贪心算法、启发式算法。
老老实实地搞吧,从0学class。突然发现这么大的数据量,有那么多相通的参数,不用面向对象,用单独的函数式编程,有点头大(虽然也能做,但是对于封装和以后的而调用。。。emmm)
太难了,还是先看看题目的站台连接关系吧。想用A*算法,但是H函数不好预估,因为这并不是一个二维的平面,而且,得到的站台也是邻接矩阵的关系,并不是一张地图。
graph无向图、有向图作画
难受,graph不能只通过pip下载,还需要装软件,然后修改环境变量。
还是不行。。
最后重启电脑,就好了!???
conda里装digraph
*是为了传递参数啦。
Python中的*使用
之前了解过A但是没有具体去实现过,现在想用A+Qrouting来做中兴算法大赛。准确的说,大概的思路是,父类构建一个环境(站点人员,轨道车厢以及载重),子类构建一个货物(含货物的重量,轨道信息,车厢信息)。调度算法用Qlearning和dijkstra其实都可以,但是算的挺慢的,所以想用A*算法中的启发函数来减少寻找路径所需要的时间。
但是,一般的A*算法的地图都是2D的,而货物传输的地图并不是2D的,我目前能得到的只是一个站台与站台之间的邻接矩阵,这可怎么用启发函数(一般来说启发函数是 目的点和当前点之间的距离,如果不是2D地图。。)
欸,可以学习到这个启发函数嘛。先学一遍,把所有的边权重都设1,每次经过就衰减1,(最后取反,每个1代表1跳,也就是距离远近)这样得到了一个跳数表,也就是启发函数了。
这样每次规划货物路径的时候都能少去探索一些节点。毕竟只有60s的时间。不容易。
python class的使用
Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)
这种组合能大幅地缩减学习的时间,暂时不用A了。(把A重新配置好,估计比赛都结束了)
贪心算法是取周围最大的值,这正好可以用在Q学习过程中,选取一个最大值作为跳转。不过始终觉得有点,浪费了一些跳数(换来的是更简单)
3维数据找某一列
见我的另一篇博客:
window平台的bat批处理
仔细查证,因为算法未收敛,导致错误的下一个站台,故轨道ID=0.
昨晚设计了一晚人员,居然还是超员了。我想法是这样的,先规划路径,然后根据选定的轨道,访问车厢,如果车厢有空间,考虑是上货,下货(对应位置人员-1),转移(来去是否有人员,如果没有就安排人员,当然前提是站台还有人),不转移。
开始对着test.txt进行狂改,测试代码问题在哪儿。
目前得分2.9分,排名137,我太菜了。
这个可以提高4倍以上的分数,因为有很多重叠的源目站台可以减少规划的次数。
我发现减少迭代次数(以前是5050,现在是3030)能增加得分,2.9->4.7但是站台人员超标了。
上货(-1),下货,转移(-2),不转移(-0),汇聚(-2),分流(-2)。
原来规划的路径上,新上了货物,这种不叫上货叫汇聚,来的方向也要安排一个人。
numpy最快,比原生还快
提升Python程序运行效率的方法总结:
优雅地写python代码
有哪些问题可以通过python使用一句原生语句求得
lastIndex = TrackEnvir.MapPlanned[:, current_state, Carindex] == 1 #如果该行有1就返回True 否则返回false 的一维矩阵
lastAllstate = np.argwhere(lastIndex == True)#得到1的位置(2维)
lastAllstate = lastAllstate.flatten() # 多维转1D 寻找方便
其实这次比赛算很仓促吧,原因如下:
不过,学到了挺多东西:
python技术(进一步锻炼)
面向对象、数据结构、情景建模
在找bug上,根据错误自己构建测试错误条件去测试(给定的测试例无序,很难发现问题之处,不利于查验是否改正了bug)
总结还是老老实实写硬件逻辑吧。软件作为辅助。该回去画版图,设计cpu了。(微处理器结构的老师说我们这些个缺乏软件的思维,的确,造了cpu就是给软件程序员用的,不了解程序员怎么写代码,这cpu设计出来干瞪眼?)