這涉及到一個將SAS中的雙向ANOVA程序轉換爲Python的項目。Python的列表解析和其他更好的實踐
我週四開始嘗試學習語言,所以我知道我有很大的改進空間。如果我錯過了一些明顯的東西,無論如何,請告訴我。我還沒有得到Sage的運行,也沒有numpy,所以現在,這些都是相當香草的Python 2.6.1。 (便攜式)
主要查詢:需要一套很好的列表解析功能,可以按照因子A,因子B,總體以及每個因子水平的組提取列表中的樣品列表中的數據A & B AXB)。
一些工作之後,數據是在以下的形式(嵌套列表的3層):
反應[A] [B] [n]的
(意味着〔A1 [B1 [N1, ...,nN] ... [bB [n1,... nN]]],...,[aA [b1 [n1,...,nN] ... [bB [n1,... NN]]] 希望是十分明顯的)在我的例子的情況下
因子水平:A = 3(0-2),B = 8(0-7),N = 8(0-7)
byA= [[a[i] for i in range(b)] for a[b] in response]
(可以有人解釋爲什麼這種語法的作品?我偶然發現它試圖看看解析器會接受什麼。我還沒有在其他地方看到這種行爲的附加語法,但它非常好。有關該主題的網站或書籍的任何良好鏈接將不勝感激。編輯:運行之間的變量持久性解釋了這種古怪。這是行不通的。)
byB=lstcrunch([[Bs[i] for i in range(len(Bs)) ]for Bs in response])
(據熊指出,zip(*response)
幾乎我想要做什麼。上面的版本不實際工作,我記得,我還沒有經過仔細的測試運行還。)
byAxB= [item for sublist in response for item in sublist]
(由亞歷克斯·馬爾泰利在本網站的響應被盜。同樣可能有人解釋爲什麼?列表中理解語法不是很好的我一直在閱讀文本解釋。)
ByO= [item for sublist in byAxB for item in sublist]
(顯然,我只是在這裏重用了以前的理解,因爲它做了我所需要的。編輯:)
我希望這些結束了相同的數據類型,至少當循環的問題因素,s.t.可以應用和使用相同的平均/和/ SS /等功能。
這很容易通過一些清潔劑來代替:
def lstcrunch(Dlist):
"""Returns a list containing the entire
contents of whatever is imported,
reduced by one level.
If a rectangular array, it reduces a dimension by one.
lstcrunch(DataSet[a][b]) -> DataOutput[a]
[[1, 2], [[2, 3], [2, 4]]] -> [1, 2, [2, 3], [2, 4]]
"""
flat=[]
if islist(Dlist):#1D top level list
for i in Dlist:
if islist(i):
flat+= i
else:
flat.append(i)
return flat
else:
return [Dlist]
哦,而我的話題,什麼是識別變量列表的首選方式? 我一直在使用:
def islist(a):
"Returns 'True' if input is a list and 'False' otherwise"
return type(a)==type([])
離別查詢: 有沒有辦法來明確強制淺拷貝轉換爲深?複製?或者,類似地,當複製到一個變量中時,是否有一種方法可以聲明該賦值應該替換指針,而不僅僅是值? (S.T.該作業不會傳播到其他淺層副本)。同樣,使用它也可能會有用,所以能夠控制它何時發生或不發生聽起來真的很好。 (我真的踩遍自己,當我準備我的表,通過調用插入: 響應= [[[0] * N] * B * A )
編輯: 進一步調查導致最這工作正常。我從那之後就開始了課程並進行了測試。它工作正常。我將保留列表理解形式以供參考。
def byB(array_a_b_c):
y=range(len(array_a_b_c))
x=range(len(array_a_b_c[0]))
return [[array_a_b_c[i][j][k]
for k in range(len(array_a_b_c[0][0]))
for i in y]
for j in x]
def byA(array_a_b_c):
return [[repn for rowB in rowA for repn in rowB]
for rowA in array_a_b_c]
def byAxB(array_a_b_c):
return [rowB for rowA in array_a_b_c
for rowB in rowA]
def byO(array_a_b_c):
return [rep
for rowA in array_a_b_c
for rowB in rowA
for rep in rowB]
def gen3d(row, col, inner):
"""Produces a 3d nested array without any naughty shallow copies.
[row[col[inner]] named s.t. the outer can be split on, per lprn for easy display"""
return [[[k for k in range(inner)]
for i in range(col)]
for j in range(row)]
def lprn(X):
"""This prints a list by lines.
Not fancy, but works"""
if isiterable(X):
for line in X: print line
else:
print x
def isiterable(a):
return hasattr(a, "__iter__")
感謝大家的回覆。由於我的智商有所改善,已經看到了代碼質量的顯着提高。當然,還有其他的想法。
這應該是大約4個不同的問題 – aaronasterling 2010-08-30 05:08:04
似乎應該已經有一個Python模塊的雙向ANOVA,但我一直無法找到它在最可能的地方('scipy.stats')。所以我很想知道你是否在某處找到了一個實現。當然,方差分析相當於scipy當然可以處理的最小二乘迴歸,但語法和術語有些不同。 – cxrodgers 2013-01-16 10:29:18
@cxrodgers如果您仍然對此感興趣,我很早以前就已經獲得了這種純粹的* Python ANOVA實現,並且甚至清理乾淨了。 (不完整的測試版是問題中最難的部分)如果您目前感興趣,我可以將它發佈到某個地方。 回到我還在乎的時候,我玩弄了調整代碼以使其接受n-way方差分析,但是我從來沒有在生活受到干擾之前補充完成。 (*我實際上是不想依賴SciPy/Numpy,順便說一句,因爲它們相當大,可能會在一些環境中安裝麻煩。) – 2015-12-04 05:10:42