使用python建模笔记

之前从来没有接触过python,然后这次项目需要,所以只能硬着头皮上。

已经连续熬了三天的夜了,还不知道要熬多长时间。今天中午到达了崩溃点。但崩溃完还得接着做。或者说,不管你崩溃不崩溃,先把任务做完,之后没人管你。

调代码的时候犯了很多错,为了避免之后犯相同错误,写这个笔记。

首先最崩溃的是这个错误:

foldPath = '/home/wyj/projects/rain/optical_flow_extrapolate/data/train_ex_modelA_4layers/'
    filename = 'L%d/T_modelA_%d/%dex%d.png' % (layer + 1, i + 1, i + 1, time + 1);
    img = Image.open(foldPath + filename)

看着没什么错吧


然而就是报了这个错误。然后我找啊找,找啊找。然后改成了这个样子:

foldPath = '/home/wyj/projects/rain/optical_flow_extrapolate/data/train_ex_modelA_4layers/'
    filename = 'L%d/T_modelA_%d/%dex%d.png' % (layer + 1, i + 1, i + 1, time + 1);
    imagePath = foldPath + filename
    img = Image.open(imagePath)


就没问题了。

只能说一句,open里面不能进行字符串的拼接。【笑哭】


接着我又和extend。append较上劲了。

我写了这样一个简单的代码:

a = [1, ]
a.extend(2)
print(a)

然后又报错了。私以为append和extend的用法是相同的,只不过一个增加了子list,一个增加的直接是list中的若干元素。

然而:


然后找到了这个链接:点击打开链接

总之就是这两个函数只接受一个元素。但extend一定接受的是一个list,然后这个list中的所有元素放到使用对象list中。

但是append的输入是什么都可以,但一定会直接放到原来list的末尾。

然后自己构建的模型历经各种磨难终于写出来了,又等着运行了一整天,然后,今天早上想着终于可以来查收结果了,到了丰收的季节了,结果模型效果超级烂。报给师兄,打回重做。我懵了,不知道该咋办。然后就开始看师姐的代码,努力学习知识啊啊啊啊啊。

首先,垂直拼接list:hstack

感觉超级方便啊啊啊啊

链接:点击打开链接

绝对有学习到

然后程序接着出错,然后我的程序接着无限期延后,然后接着各种长经验

趁着程序运行不用挑错的时候总结一下各种错误,梳理一下。

首先,昨天调程序到最后调懵了,是不应该这样的。调程序应该是小幅度向前迭代而不是直接把觉得错的地方改完直接又扔到服务器上,这是不负责的。也是没效率的,最后累的还是自己。

然后需要学习python的数据基本结构和用法,在这里经常发蒙,所以耽误了很多时间。

注意这句代码:

file_object = open(myName, 'a')

这句代码的意思是打开文件,如果进行写操作的话是直接将写入的内容添加到末尾而不是覆盖之前的文件。对于需要反复写入的文件。'a'这个属性是必须要有的,但要注意。当程序中断再运行之后,会直接打开之前程序写过的文件接着向下写,不会因为程序的终止而在下一次运行程序的时候自己将自己清空。

所以最笨的方法是将之前的程序删除之后再进行操作。

然后我觉得应该在程序第一次写入文件之前判断文件是否存在,如果文件存在的话需要先将文件进行删除。但是考虑到程序中判断是否为第一次打开很麻烦,直接利用一个小循环将文件全部删除,删除文件有两种 方法:

f = open('x.txt', 'w')

f .close()


 os.remove(image_remove)  


hstack()函数的使用:

import numpy as np
from numpy import *
a = [[1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2]]
print(np.shape(a))
b = [[3, ], [3, ], [3, ], [3, ], [3, ], [3, ], [3, ], [3, ]]
print(np.shape(b))
c = np.hstack((a, b))
print(c)
如果是这样就是对的。但是只要将程序进行稍微的修改一下:

import numpy as np
from numpy import *
a = [[1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2]]
print(np.shape(a))
b = [3, 3, 3, 3, 3, 3, 3, 3]
print(np.shape(b))
c = np.hstack((a, b))
print(c)
会报如下错误:


感觉上述代码没有问题,但是,a是2维的,b是1维的,这是最大的问题。对于hstack这个函数是严格要求维度一致的。

但是又经过测试,发现只有2维的可以行数相同,但列数不同。除此之外,多维向量必须全部维度都相同,除了最后一个维度,例:

a = [[[1, 2], [1, 2]], [[1, 2], [1, 2]], [[1, 2], [1, 2]], [[1, 2], [1, 2]], [[1, 2], [1, 2]], [[1, 2], [1, 2]], [[1, 2], [1, 2]], [[1, 2], [1, 2]]]
print(np.shape(a))
b = [[[3, 3], [3, 3]], [[3, 3], [3, 3]], [[3, 3], [3, 3]], [[3, 3], [3, 3]], [[3, 3], [3, 3]], [[3, 3], [3, 3]], [[3, 3], [3, 3]], [[3, 3], [3, 3]]]
print(np.shape(b))

只有上述这种形式是对的。


在程序运行过程中发现有这种文件的生成:

what,这种形式的文件根本没见过呀 ,这都是啥!!!!!!

所以,需要去解决这个问题了。

然后我换了一个读取文件的函数。原来是:

(格式错了,伤心,填上txt)

mat = readMat(matPath)
def readMat(matPath):
    listData = []
    file_object = open(matPath)
    for line in file_object.readlines():
        strLine = line.strip().split(' ')
        numLine = [float(i) for i in strLine]
        listData.append(numLine)
    return np.matrix(listData)
直接用的师姐的代码,然而我并不明白啥意思,然后仔细思考了一下,用了这个代码:
mat = np.loadtxt(matPath)


这样就可以了,所以就需要讨论这二者有啥不一样了。其实说到底就是数据模式不同导致的差异。我生成的文件直接就是将array放到TXT中。看上面的,意思应该是将生成的数字转换为string,然后将string放到TXT中,之后读取数据的时候也是读取string中的float数值。
其实如果要是把数据格式处理的好的话,直接就可以使用loadtxt就可以了。数据直接转换为array,就这样。


之后就又是一个更加致命的错误了。只能说是不同语言的差异害死人。
是这样的,原始数据非常大又非常分散,所以我先将原始数据从分散的地方都读出来,然后集中放置在一个文件夹中的若干文件中。但是这个操作只需要进行一次,一次就可以了。我在总的文件中先引入数据处理文件,然后调用数据处理文件中的总函数(将其中的所有数据读取的函数进行了全部封装)进行数据的 获取。在获取全部数据之后,我将总文件的这个函数调用注释掉,然后再进行下面的函数。下面的第一个函数入口处我就进行了一个print。开始服务器跑了5min,没反应,十分钟,还是没反应。经过若干次实验,若干次错误,我看到了旁边放置数据的文件,最后更新是一分钟前?what!!!!!然后我意识到了一个可怕的问题,又重新读取了数据。然后颤抖双手打开TXT文件。明明应该是10000行数据,谁能告诉我变成了60000行!所以就进行了测试,发现,引入的py文件在最后又一句命令,调用全部函数,所以,呵呵呵呵呵呵呵。在我进行的若干次试验中,进行了几次实验,就重新运行了几次。不,不是几次,是几十次。一把辛酸泪啊啊啊啊。Java不是这样的呀。matlab不是这样的呀,C,C++就更不是了。谁告诉我的python上手快,好想咬死他。但是还好终于在坑里面爬出来了。
然后也碰到在使用之前的数据出错的问题了。在之前就是会直接心疼自己三秒,咋出错了呢,然后先重新运行一下刚才的程序,然后看看是不是人品问题。如果再出错,然后看看提示之类的。可姐姐这次是先把错误输出好好看了一下,然后读了一次,又读了一次,然后找到错误代码的位置,说是读取第1811行数据出错。之前的相同文件都没有问题,然后就这里出错了,肯定有点奇怪呀,就干脆将文件打开了。发现文件只有1810行,说好的2000行数据呢大哭。然后重新读取数据吧。起码跳了这么多坑,知道点该怎么出坑的方法了。
接下来就是在各种查资料的过程中对基础知识的补充:
a = range(10)
print(a)
a = np.arange(10)
print(a)


结果:


所以个人认为:range多用于循环,arange生成有序数组,输入参数都一样,start,end和step。不同的就是返回值。range返回的是range对象,而arange函数返回的是ndarry对象,是一种超级方便的数据格式,可以不用循环寻找函数,很像matlab中的矩阵,使用规则也很像。
array也可以进行转置,好开森。偷笑这样当数据不小心取错的时候直接一转置就可以了,吼吼。
arr=np.arange(15).reshape((3,5))    #生成顺序数组,后整形为3行5列
print(arr)
arr = arr.T    #转置
print(arr)
结果为:






然后找到了一个比较有意思的代码:
xarr=np.array([1.1,1.2,1.3,1.4,1.5])    #两个数值数组
yarr=np.array([2.1,2.2,2.3,2.4,2.5])
cond = np.array([True,False,True,True,False])    #一个布尔数组
结果是:
还有其他更多操作在这里:点击打开链接
写的很棒,发现numpy真的是很方便


这个链接的东西还需要载学习一下,不是很明白:点击打开链接


mat = readMat(matPath)
def readMat(matPath):
    listData = []
    file_object = open(matPath)
    for line in file_object.readlines():
        strLine = line.strip().split(' ')
        numLine = [float(i) for i in strLine]
        listData.append(numLine)
    return np.matrix(listData)


直接用的师姐的代码,然而我并不明白啥意思,然后仔细思考了一下,用了这个代码:

mat = np.loadtxt(matPath)

这样就可以了,所以就需要讨论这二者有啥不一样了。其实说到底就是数据模式不同导致的差异。我生成的文件直接就是将array放到TXT中。看上面的,意思应该是将生成的数字转换为string,然后将string放到TXT中,之后读取数据的时候也是读取string中的float数值。

其实如果要是把数据格式处理的好的话,直接就可以使用loadtxt就可以了。数据直接转换为array,就这样。


之后就又是一个更加致命的错误了。只能说是不同语言的差异害死人。

是这样的,原始数据非常大又非常分散,所以我先将原始数据从分散的地方都读出来,然后集中放置在一个文件夹中的若干文件中。但是这个操作只需要进行一次,一次就可以了。我在总的文件中先引入数据处理文件,然后调用数据处理文件中的总函数(将其中的所有数据读取的函数进行了全部封装)进行数据的 获取。在获取全部数据之后,我将总文件的这个函数调用注释掉,然后再进行下面的函数。下面的第一个函数入口处我就进行了一个print。开始服务器跑了5min,没反应,十分钟,还是没反应。经过若干次实验,若干次错误,我看到了旁边放置数据的文件,最后更新是一分钟前?what!!!!!然后我意识到了一个可怕的问题,又重新读取了数据。然后颤抖双手打开TXT文件。明明应该是10000行数据,谁能告诉我变成了60000行!所以就进行了测试,发现,引入的py文件在最后又一句命令,调用全部函数,所以,呵呵呵呵呵呵呵。在我进行的若干次试验中,进行了几次实验,就重新运行了几次。不,不是几次,是几十次。一把辛酸泪啊啊啊啊。Java不是这样的呀。matlab不是这样的呀,C,C++就更不是了。谁告诉我的python上手快,好想咬死他。但是还好终于在坑里面爬出来了。

然后也碰到在使用之前的数据出错的问题了。在之前就是会直接心疼自己三秒,咋出错了呢,然后先重新运行一下刚才的程序,然后看看是不是人品问题。如果再出错,然后看看提示之类的。可姐姐这次是先把错误输出好好看了一下,然后读了一次,又读了一次,然后找到错误代码的位置,说是读取第1811行数据出错。之前的相同文件都没有问题,然后就这里出错了,肯定有点奇怪呀,就干脆将文件打开了。发现文件只有1810行,说好的2000行数据呢大哭。然后重新读取数据吧。起码跳了这么多坑,知道点该怎么出坑的方法了。

接下来就是在各种查资料的过程中对基础知识的补充:

a = range(10)
print(a)
a = np.arange(10)
print(a)

结果:


所以个人认为:range多用于循环,arange生成有序数组,输入参数都一样,start,end和step。不同的就是返回值。range返回的是range对象,而arange函数返回的是ndarry对象,是一种超级方便的数据格式,可以不用循环寻找函数,很像matlab中的矩阵,使用规则也很像。

array也可以进行转置,好开森。偷笑这样当数据不小心取错的时候直接一转置就可以了,吼吼。

arr=np.arange(15).reshape((3,5))    #生成顺序数组,后整形为3行5列
print(arr)
arr = arr.T    #转置
print(arr)
结果为:



然后找到了一个比较有意思的代码:

xarr=np.array([1.1,1.2,1.3,1.4,1.5])    #两个数值数组
yarr=np.array([2.1,2.2,2.3,2.4,2.5])
cond = np.array([True,False,True,True,False])    #一个布尔数组
结果是:

还有其他更多操作在这里:点击打开链接

写的很棒,发现numpy真的是很方便


这个链接的东西还需要载学习一下,不是很明白:点击打开链接


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章