十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
def transpose(L):
發(fā)展壯大離不開廣大客戶長(zhǎng)期以來的信賴與支持,我們將始終秉承“誠(chéng)信為本、服務(wù)至上”的服務(wù)理念,堅(jiān)持“二合一”的優(yōu)良服務(wù)模式,真誠(chéng)服務(wù)每家企業(yè),認(rèn)真做好每個(gè)細(xì)節(jié),不斷完善自我,成就企業(yè),實(shí)現(xiàn)共贏。行業(yè)涉及成都混凝土攪拌罐車等,在網(wǎng)站建設(shè)公司、成都全網(wǎng)營(yíng)銷推廣、WAP手機(jī)網(wǎng)站、VI設(shè)計(jì)、軟件開發(fā)等項(xiàng)目上具有豐富的設(shè)計(jì)經(jīng)驗(yàn)。
T = [list(tpl) for tpl in zip(*L)]
return T
需求:
你需要轉(zhuǎn)置一個(gè)二維數(shù)組,將行列互換.
討論:
你需要確保該數(shù)組的行列數(shù)都是相同的.比如:
arr = [[1, 2, 3], [4, 5, 6], [7,8, 9], [10, 11, 12]]
列表遞推式提供了一個(gè)簡(jiǎn)便的矩陣轉(zhuǎn)置的方法:
print [[r[col] for r in arr] for col in range(len(arr[0]))]
[[1, 4, 7, 10], [2, 5, 8, 11],[3, 6, 9, 12]]
另一個(gè)更快和高級(jí)一些的方法,可以使用zip函數(shù):
print map(list,
zip(*arr))
本節(jié)提供了關(guān)于矩陣轉(zhuǎn)置的兩個(gè)方法,一個(gè)比較清晰簡(jiǎn)單,另一個(gè)比較快速但有些隱晦.
有時(shí)候,數(shù)據(jù)到來的時(shí)候使用錯(cuò)誤的方式,比如,你使用微軟的ADO接口訪問數(shù)據(jù)庫(kù),由于Python和MS在語言實(shí)現(xiàn)上的差別.
Getrows方法在Python中可能返回的是列值,和方法的名稱不同.本節(jié)給的出的方法就是這個(gè)問題常見的解決方案,一個(gè)更清晰,一個(gè)更快速.
在列表遞推式版本中,內(nèi)層遞推式表示選則什么(行),外層遞推式表示選擇者(列).這個(gè)過程完成后就實(shí)現(xiàn)了轉(zhuǎn)置.
在zip版本中,我們使用*arr語法將一維數(shù)組傳遞給zip做為參數(shù),接著,zip返回一個(gè)元組做為結(jié)果.然后我們對(duì)每一個(gè)元組使用list方法,產(chǎn)生了列表的列表(即矩陣).因?yàn)槲覀儧]有直接將zip的結(jié)果表示為list,
所以我們可以我們可以使用itertools.izip來稍微的提高效率(因?yàn)閕zip并沒有將數(shù)據(jù)在內(nèi)存中組織為列表).
import itertools
print map(list,
itertools.izip(*arr))
但是,在特定的情況下,上面的方法對(duì)效率的微弱提升不能彌補(bǔ)對(duì)復(fù)雜度的增加.
關(guān)于*args和**kwds語法:
*args(實(shí)際上,*號(hào)后面跟著變量名)語法在Python中表示傳遞任意的位置變量,當(dāng)你使用這個(gè)語法的時(shí)候(比如,你在定義函數(shù)時(shí)使用),Python將這個(gè)變量和一個(gè)元組綁定,并保留所有的位置信息,
而不是具體的變量.當(dāng)你使用這個(gè)方法傳遞參數(shù)時(shí),變量可以是任意的可迭代對(duì)象(其實(shí)可以是任何表達(dá)式,只要返回值是迭代器).
**kwds語法在Python中用于接收命名參數(shù).當(dāng)你用這個(gè)方式傳遞參數(shù)時(shí),Python將變量和一個(gè)dict綁定,保留所有命名參數(shù),而不是具體的變量值.當(dāng)你傳遞參數(shù)時(shí),變量必須是dict類型(或者是返回值為dict類型的表達(dá)式).
如果你要轉(zhuǎn)置很大的數(shù)組,使用Numeric Python或其它第三方包,它們定義了很多方法,足夠讓你頭暈的.
相關(guān)說明:
zip(...)
zip(seq1 [,
seq2 [...]]) - [(seq1[0], seq2[0] ...),
(...)]
Return a
list of tuples, where each tuple contains the i-th element
from each of
the argument sequences. The returned list is truncated
in length to
the length of the shortest argument sequence.
如果解決了您的問題請(qǐng)采納!
如果未解決請(qǐng)繼續(xù)追問
因?yàn)樵贛athematica中使用循環(huán)確實(shí)是低效的。。。。。。
深層次的原因涉及到Mathematica的底層實(shí)現(xiàn)所以我不太懂,但是至少?gòu)南旅鎺讉€(gè)例子可以看出Mathematica里確實(shí)有很多比循環(huán)更好的方法
求和
首先舉一個(gè)最簡(jiǎn)單的求和例子,求的值。為了測(cè)試運(yùn)行時(shí)間取n=10^6
一個(gè)剛接觸Mathematica的同學(xué)多半會(huì)這樣寫
sum = 0;
For[i = 1, i = 10^6, i++,
sum += Sin[N@i]];
(*其中N@i的作用是把整數(shù)i轉(zhuǎn)化為浮點(diǎn)數(shù),類似于C里的double*)
sum
為了便于計(jì)時(shí)用Module封裝一下,運(yùn)行時(shí)間是2.13秒,如下圖
然后一個(gè)有一定Mathematica經(jīng)驗(yàn)的同學(xué)多半會(huì)知道同樣作為循環(huán)的Do速度比For快,于是他可能會(huì)這么寫
然后一個(gè)有一定Mathematica經(jīng)驗(yàn)的同學(xué)多半會(huì)知道同樣作為循環(huán)的Do速度比For快,于是他可能會(huì)這么寫
sum = 0;
Do[sum += Sin[N@i], {i, 1, 10^6}];
sum
如下圖,用時(shí)1.37秒,比For快了不少
當(dāng)然了知道Do速度比For快的同學(xué)不太可能不知道Sum函數(shù),所以上面其實(shí)是我口胡的,他應(yīng)該會(huì)這么寫
Sum[Sin[N@i], {i, 1, 10^6}]
如下圖,同樣的結(jié)果,只用了不到0.06秒
如果這位同學(xué)還知道Listable屬性并且電腦內(nèi)存不算太小的話,他也可能會(huì)這么寫
Tr@Sin[N@Range[10^6]]
如下圖,只用了不到0.02秒,速度超過For循環(huán)的100倍
當(dāng)然了這只是一個(gè)最簡(jiǎn)單的例子,而且如果數(shù)據(jù)量更大的話最后一種方法就不能用了。但是這也足以說明在求和時(shí)用循環(huán)是低效的,無論是內(nèi)置的Sum函數(shù)還是向量化運(yùn)算,在效率上都遠(yuǎn)遠(yuǎn)高于循環(huán)
(這部分模仿了不同程序員如何編寫階乘函數(shù)這篇文章,強(qiáng)烈推薦對(duì)Mathematica有興趣的同學(xué)去看看)
迭代
接下來舉一個(gè)迭代的例子,(即Logistic map),取,為了測(cè)試運(yùn)行時(shí)間同樣取n=10^6
還是先用For循環(huán)的做法
x = 0.5;
For[i = 1, i = 10^6, i++,
x = 3.5 x (1 - x);
];
x
如下圖,運(yùn)行時(shí)間2.06秒
(Do循環(huán)和For類似,篇幅所限這里就不寫了,有興趣的同學(xué)可以自行嘗試)
(Do循環(huán)和For類似,篇幅所限這里就不寫了,有興趣的同學(xué)可以自行嘗試)
然后看看內(nèi)置的Nest函數(shù)
Nest[3.5 # (1 - #) , 0.5, 10^6]
如下圖,用時(shí)0.02秒,又是將近兩個(gè)數(shù)量級(jí)的效率差異
當(dāng)然了Nest的使用涉及到純函數(shù),對(duì)于Mathematica初學(xué)者來說可能有些難以理解,而且一些比較復(fù)雜的迭代不太容易寫成Nest的形式,但是在迭代時(shí)Nest(還包括Fold)的效率確實(shí)要好于循環(huán)
當(dāng)然了Nest的使用涉及到純函數(shù),對(duì)于Mathematica初學(xué)者來說可能有些難以理解,而且一些比較復(fù)雜的迭代不太容易寫成Nest的形式,但是在迭代時(shí)Nest(還包括Fold)的效率確實(shí)要好于循環(huán)
遍歷列表
依然舉一個(gè)簡(jiǎn)單的例子:求一個(gè)列表中偶數(shù)的個(gè)數(shù)。為測(cè)試生成10^6個(gè)1到10之間的隨機(jī)整數(shù)
list = RandomInteger[{1, 10}, 10^6];
(*生成10^6個(gè)隨機(jī)整數(shù)*)
如果用For循環(huán)的話代碼是這樣的
num = 0;
1.numpy的導(dǎo)入和使用
data1=mat(zeros((
)))
#創(chuàng)建一個(gè)3*3的零矩陣,矩陣這里zeros函數(shù)的參數(shù)是一個(gè)tuple類型(3,3)
data2=mat(ones((
)))
#創(chuàng)建一個(gè)2*4的1矩陣,默認(rèn)是浮點(diǎn)型的數(shù)據(jù),如果需要時(shí)int類型,可以使用dtype=int
data3=mat(random.rand(
))
#這里的random模塊使用的是numpy中的random模塊,random.rand(2,2)創(chuàng)建的是一個(gè)二維數(shù)組,需要將其轉(zhuǎn)換成#matrix
data4=mat(random.randint(
10
,size=(
)))
#生成一個(gè)3*3的0-10之間的隨機(jī)整數(shù)矩陣,如果需要指定下界則可以多加一個(gè)參數(shù)
data5=mat(random.randint(
,size=(
))
#產(chǎn)生一個(gè)2-8之間的隨機(jī)整數(shù)矩陣
data6=mat(eye(
,dtype=
int
))
#產(chǎn)生一個(gè)2*2的對(duì)角矩陣
a1=[
]; a2=mat(diag(a1))
#生成一個(gè)對(duì)角線為1、2、3的對(duì)角矩陣
python將數(shù)組轉(zhuǎn)換為矩陣,方法如下:
數(shù)組轉(zhuǎn)換矩陣:?
A = mat(s[])
Python的定義:
Python是一種面向?qū)ο?、直譯式計(jì)算機(jī)程序設(shè)計(jì)語言,Python語法簡(jiǎn)捷而清晰,具有豐富和強(qiáng)大的類庫(kù)。
它常被為膠水語言,它能夠很輕松的把用其他語言制作的各種模塊(尤其是C/C++)輕松地聯(lián)結(jié)在一起。常見的一種應(yīng)用情形是,使用python快速生成程序的原型(有時(shí)甚至是程序的最終界面),然后對(duì)其中有特別要求的部分,用更合適的語言改寫。比如3D游戲中的圖形渲染模塊,速度要求非常高,就可以用C++重寫。