使用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真的是很方便


這個鏈接的東西還需要載學習一下,不是很明白:點擊打開鏈接


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