Numpy基礎(chǔ)(一)

Numpy是Python一個(gè)很重要的第三方庫杖狼,用于科學(xué)計(jì)算充石。
注:以下代碼均在jupyter qtconsole中實(shí)現(xiàn)榛臼,導(dǎo)入了%pylab環(huán)境。


生成數(shù)據(jù)

linspace

linspace用來生成一組等間隔的數(shù)據(jù)

In [51]: %pylab # 啟用pylab模式恩静,直接導(dǎo)入了很多科學(xué)計(jì)算庫焕毫。
In [52]: a = linspace(0, 2*pi, 21)

In [53]: a
Out[53]: 
array([ 0.        ,  0.31415927,  0.62831853,  0.9424778 ,  1.25663706,
        1.57079633,  1.88495559,  2.19911486,  2.51327412,  2.82743339,
        3.14159265,  3.45575192,  3.76991118,  4.08407045,  4.39822972,
        4.71238898,  5.02654825,  5.34070751,  5.65486678,  5.96902604,
        6.28318531])

In [54]: %precision 3 # 在qtconsole中設(shè)置數(shù)據(jù)顯示精度為小數(shù)點(diǎn)后3位。若直接使用%precision即可恢復(fù)默認(rèn)精度驶乾。
Out[54]: '%.3f'

In [55]: a
Out[55]: 
array([ 0.   ,  0.314,  0.628,  0.942,  1.257,  1.571,  1.885,  2.199,
        2.513,  2.827,  3.142,  3.456,  3.77 ,  4.084,  4.398,  4.712,
        5.027,  5.341,  5.655,  5.969,  6.283])

ogrid

ogrid方法產(chǎn)生一系列等差數(shù)據(jù)邑飒,類似于Matlabstart:step:stop。示例如下:

In [27]: x = ogrid[0:10]

In [28]: x
Out[28]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [29]: x = ogrid[0:10:2]

In [30]: x
Out[30]: array([0, 2, 4, 6, 8])

# 小技巧:若產(chǎn)生的數(shù)組要包含末尾的數(shù)级乐,可以使用虛數(shù)符號"j"加以實(shí)現(xiàn)疙咸。
In [32]: x
Out[32]: array([  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.])

In [33]: x = ogrid[0:10:6j]

In [34]: x
Out[34]: array([  0.,   2.,   4.,   6.,   8.,  10.])

# 還可以直接產(chǎn)生二維數(shù)據(jù)
In [35]: x, y = ogrid[0:10:2, 10:20:6j]

In [36]: x
Out[36]: 
array([[ 0.],
       [ 2.],
       [ 4.],
       [ 6.],
       [ 8.]])

In [37]: y
Out[37]: array([[ 10.,  12.,  14.,  16.,  18.,  20.]])

另外,r_唇牧,c_分別產(chǎn)生行向量數(shù)據(jù)與列向量數(shù)據(jù)罕扎,使用方法與此類似聚唐。

快捷方式產(chǎn)生矩陣

ones丐重,zerosempty杆查,identity等分別產(chǎn)生1矩陣扮惦,0矩陣,空矩陣(0矩陣)亲桦,單位矩陣(對角線為1)

顯示命名空間參數(shù)

使用who()或者whos即可顯示當(dāng)前命名空間參數(shù)崖蜜,如:

In [92]: who()
Name            Shape            Bytes            Type
===========================================================

size            200              1600             float64
a               21               168              float64
b               21               168              float64
_25 (b)         21               168              float64
_29 (b)         21               168              float64
_30             21               21               bool
x               50               400              float64
_45             200              1600             float64
y               50               400              float64
_48             200              1600             float64
_50 (_45)       200              1600             float64
_51 (_48)       200              1600             float64
_53 (size)      200              1600             float64
color           200              1600             float64
t               50               400              float64

Upper bound on total bytes  =       7957

In [93]: whos
Variable   Type       Data/Info
-------------------------------
a          ndarray    21: 21 elems, type `float64`, 168 bytes
b          ndarray    21: 21 elems, type `float64`, 168 bytes
color      ndarray    200: 200 elems, type `float64`, 1600 bytes
size       ndarray    200: 200 elems, type `float64`, 1600 bytes
t          ndarray    50: 50 elems, type `float64`, 400 bytes
x          ndarray    50: 50 elems, type `float64`, 400 bytes
y          ndarray    50: 50 elems, type `float64`, 400 bytes

數(shù)組屬性

建立了數(shù)組a,則它的常用屬性如下:

In [162]: a = array([[1, 2, 3], [4, 5, 6]])

In [163]: a
Out[163]: 
array([[1, 2, 3],
       [4, 5, 6]])

1.查看類型

In [164]: type(a)
Out[164]: numpy.ndarray

2.查看數(shù)組中的數(shù)據(jù)類型

In [165]: a.dtype
Out[165]: dtype('int64')

3.查看數(shù)組中每個(gè)元素所占字節(jié)

In [166]: a.itemsize
Out[166]: 8

4.查看數(shù)組的行列數(shù)

In [167]: a.shape
Out[167]: (2, 3) # 說明是2行3列的數(shù)組

5.查看數(shù)組元素?cái)?shù)目

In [168]: a.size
Out[168]: 6 # 數(shù)組元素?cái)?shù)目等于行數(shù)與列數(shù)的乘積

6.查看數(shù)組所占空間

In [169]: a.nbytes
Out[169]: 48 # 數(shù)組所占空間為數(shù)組的itemize與size的乘積

7.查看數(shù)組維數(shù)

In [170]: a.ndim
Out[170]: 2 # 表明是二維數(shù)組

fill填充數(shù)據(jù)

fill方法將數(shù)組設(shè)置為指定值客峭。如:

In [180]: a
Out[180]: 
array([[1, 2, 3],
       [4, 5, 6]])

In [181]: a.fill(-4.8)

In [182]: a
Out[182]: 
array([[-4, -4, -4],
       [-4, -4, -4]])

注意豫领,此時(shí)a保持行列數(shù)不變,元素全部變成了-4舔琅。但是為什么不是-4.8呢等恐?那是因?yàn)榇藭r(shí)數(shù)組adtypeint,所以只能保留為整數(shù)备蚓】问撸可做如下更改:

In [183]: a.dtype
Out[183]: dtype('int64')

In [184]: a.dtype = 'float'

In [185]: a.dtype
Out[185]: dtype('float64')

In [186]: a.fill(-4.8)

In [187]: a
Out[187]: 
array([[-4.8, -4.8, -4.8],
       [-4.8, -4.8, -4.8]])

可以看到,此時(shí)a中所有元素變成了-4.8郊尝。

任意類型的數(shù)組

numpy中的數(shù)組默認(rèn)為同一類型二跋,可以是數(shù)值型,也可以是字符串型流昏,但不能是混合型扎即。但是吞获,當(dāng)使用dtype=object時(shí),即可創(chuàng)建任意類型的數(shù)組铺遂。如:

In [398]: a = array([1, 1.2, 'hello', [10, 20, 30]], dtype=object)

In [399]: a
Out[399]: array([1, 1.2, 'hello', [10, 20, 30]], dtype=object)

In [400]: a.itemsize
Out[400]: 8

In [402]: a.dtype
Out[402]: dtype('O')

In [403]: a * 2
Out[403]: array([2, 2.4, 'hellohello', [10, 20, 30, 10, 20, 30]], dtype=object)

數(shù)據(jù)引用

切片引用

現(xiàn)有原數(shù)組a衫哥,切片引用產(chǎn)生了數(shù)組b,修改b中的元素會影響a中的元素襟锐。如:

In [248]: a = array([0, 1, 2, 3, 4])

In [249]: a
Out[249]: array([0, 1, 2, 3, 4])

In [252]: b = a[2:4]

In [253]: b
Out[253]: array([2, 3])

In [254]: b[0] = 999

In [255]: b
Out[255]: array([999,   3])

In [256]: a
Out[256]: array([  0,   1, 999,   3,   4])

說明在numpy數(shù)組中撤逢,python并沒有為b分配新的內(nèi)存空間,而是讓b指向了a分配的內(nèi)存空間粮坞。因此蚊荣,改變b會改變a的值。
python默認(rèn)的列表就不存在此現(xiàn)象莫杈,如:

In [257]: a = [0, 1, 2, 3, 4]

In [258]: b = a[2:4]

In [259]: b
Out[259]: [2, 3]

In [260]: b[0] = 999

In [261]: b
Out[261]: [999, 3]

In [262]: a
Out[262]: [0, 1, 2, 3, 4]

若要在numpy的數(shù)組中互例,改變b不影響a的值,可以使用copy()實(shí)現(xiàn)筝闹,如:

In [271]: a = array([0, 1, 2, 3, 4])

In [272]: b = a[2:4].copy()

In [275]: b[0] = 999

In [276]: b
Out[276]: array([999,   3])

In [277]: a
Out[277]: array([0, 1, 2, 3, 4])

數(shù)組方法

sum求和

In [8]: a
Out[8]: 
array([[1, 2, 3],
       [4, 5, 6]])

In [9]: sum(a)
Out[9]: 21

In [12]: a.sum()
Out[12]: 21

沿著指定維度求和

In [10]: sum(a, axis=0) # 沿著行的維度求和
Out[10]: array([5, 7, 9])

In [11]: sum(a, axis=1) # 沿著列的維度求和
Out[11]: array([ 6, 15])

In [14]: a.sum(axis=0) # 沿著第一維求和
Out[14]: array([5, 7, 9])

In [16]: a.sum(axis=1) # 沿著第二維求和
Out[16]: array([ 6, 15])

prod求積

使用方法同sum
此外媳叨,maxmin关顷,mean糊秆, stdvar等方法與sum方法的使用也差不多议双。

clip

將數(shù)值限制在某個(gè)范圍

In [66]: a
Out[66]: 
array([[1, 2, 3],
       [4, 5, 6]])

In [67]: a.clip(3, 5) # a中小于3的數(shù)變成3痘番,大于5的數(shù)變成5
Out[67]: 
array([[3, 3, 3],
       [4, 5, 5]])

In [68]: a
Out[68]: 
array([[1, 2, 3],
       [4, 5, 6]])

ptp

計(jì)算數(shù)組中最大值與最小值的差

In [68]: a
Out[68]: 
array([[1, 2, 3],
       [4, 5, 6]])

In [69]: a.ptp()
Out[69]: 5

In [70]: a.ptp(axis=0)
Out[70]: array([3, 3, 3])

In [71]: a.ptp(axis=1)
Out[71]: array([2, 2])

round

四舍五入,0.5的近似規(guī)則為近似到偶數(shù)值平痰。

In [78]: b = rand(10)*10

In [79]: b
Out[79]: 
array([ 2.57598829,  7.69588774,  9.79707955,  7.10994638,  5.27285863,
        6.50838994,  9.39987486,  4.00583049,  2.58985365,  5.69761458])

In [80]: b.round()
Out[80]: array([  3.,   8.,  10.,   7.,   5.,   7.,   9.,   4.,   3.,   6.])

In [81]: b.round(decimals=1) # 保留1位小數(shù)的近似
Out[81]: array([ 2.6,  7.7,  9.8,  7.1,  5.3,  6.5,  9.4,  4. ,  2.6,  5.7])

從一列數(shù)據(jù)中抽出某個(gè)區(qū)間的數(shù)據(jù)

假設(shè)有0到100之間的100個(gè)隨機(jī)數(shù)汞舱,如何找出40到60之間的數(shù)據(jù)?

In [163]: a = floor(rand(100) * 100)

In [164]: a
Out[164]: 
array([  4.,  10.,   6.,  33.,  77.,  43.,  19.,  74.,  43.,  24.,  70.,
        97.,  25.,  55.,   2.,  26.,  21.,  79.,  71.,  66.,   9.,   2.,
        75.,  96.,  27.,  32.,   0.,   6.,   3.,  24.,  92.,  24.,  94.,
        38.,  34.,  67.,  81.,  94.,  55.,  16.,  22.,  88.,  76.,  53.,
        30.,  35.,  13.,   7.,  70.,  63.,  25.,  29.,  91.,  62.,  57.,
        86.,  77.,  41.,  68.,  52.,   1.,  18.,  94.,  20.,  60.,  86.,
        80.,  57.,  13.,  87.,   8.,  12.,  86.,  75.,   6.,  54.,  84.,
        36.,  34.,  56.,  37.,  55.,  85.,  22.,  18.,  95.,   8.,  91.,
        50.,  25.,  94.,  60.,  20.,  18.,  49.,  18.,  37.,  97.,  33.,
        67.])

方法之一是使用searchsorted函數(shù)實(shí)現(xiàn)宗雇。searchsorted有兩個(gè)參數(shù)昂芜,第一個(gè)參數(shù)是一列一維數(shù)組,第二個(gè)參數(shù)是一系列值赔蒲,返回值相當(dāng)于保持第一個(gè)數(shù)組的排序性質(zhì)不變泌神,將第二個(gè)數(shù)組中的值插入第一個(gè)數(shù)組中的位置∴诼模看示例:

In [183]: a.sort() # 對a進(jìn)行從小到大排序

In [184]: a
Out[184]: 
array([  0.,   1.,   2.,   2.,   3.,   4.,   6.,   6.,   6.,   7.,   8.,
         8.,   9.,  10.,  12.,  13.,  13.,  16.,  18.,  18.,  18.,  18.,
        19.,  20.,  20.,  21.,  22.,  22.,  24.,  24.,  24.,  25.,  25.,
        25.,  26.,  27.,  29.,  30.,  32.,  33.,  33.,  34.,  34.,  35.,
        36.,  37.,  37.,  38.,  41.,  43.,  43.,  49.,  50.,  52.,  53.,
        54.,  55.,  55.,  55.,  56.,  57.,  57.,  60.,  60.,  62.,  63.,
        66.,  67.,  67.,  68.,  70.,  70.,  71.,  74.,  75.,  75.,  76.,
        77.,  77.,  79.,  80.,  81.,  84.,  85.,  86.,  86.,  86.,  87.,
        88.,  91.,  91.,  92.,  94.,  94.,  94.,  94.,  95.,  96.,  97.,
        97.])

In [185]: bounds = 40, 60 # 設(shè)定邊界腻扇,下邊界為40,上邊界為60

In [186]: low_idx, high_idx = searchsorted(a, bounds) #使用searchsorted函數(shù)

In [187]: low_idx # 獲取a中下邊界40對應(yīng)的數(shù)組下標(biāo)
Out[187]: 48

In [188]: high_idx # 獲取a中上邊界60對應(yīng)的數(shù)組下標(biāo)
Out[188]: 62

In [189]: a[low_idx]
Out[189]: 41.0

In [190]: a[high_idx]
Out[190]: 60.0

In [191]: a[low_idx:high_idx] # 取得a中40到60之間的數(shù)
Out[191]: 
array([ 41.,  43.,  43.,  49.,  50.,  52.,  53.,  54.,  55.,  55.,  55.,
        56.,  57.,  57.])

連接數(shù)組

使用concatenate砾嫉,vstack幼苛,hstack等方法。

In [2]: x = array([[0, 1, 2], [10, 11, 12]])

In [3]: y = array([[50, 51, 52], [60, 61, 62]])

In [4]: z = concatenate((x, y)) # 沿著第一維度進(jìn)行連接

In [5]: z
Out[5]: 
array([[ 0,  1,  2],
       [10, 11, 12],
       [50, 51, 52],
       [60, 61, 62]])

In [6]: vstack((x, y))
Out[6]: 
array([[ 0,  1,  2],
       [10, 11, 12],
       [50, 51, 52],
       [60, 61, 62]])

In [7]: concatenate((x, y), axis=1) # 沿著第二維度進(jìn)行連接
Out[7]: 
array([[ 0,  1,  2, 50, 51, 52],
       [10, 11, 12, 60, 61, 62]])

In [8]: hstack((x, y))
Out[8]: 
array([[ 0,  1,  2, 50, 51, 52],
       [10, 11, 12, 60, 61, 62]])

扁平化數(shù)組

flatten焕刮,flat舶沿,方法將多維數(shù)組降為1維

In [10]: z
Out[10]: 
array([[ 0,  1,  2],
       [10, 11, 12],
       [50, 51, 52],
       [60, 61, 62]])

In [12]: z.flatten()
Out[12]: array([ 0,  1,  2, 10, 11, 12, 50, 51, 52, 60, 61, 62])

In [20]: z # 說明flatten()不影響原數(shù)組
Out[20]: 
array([[ 0,  1,  2],
       [10, 11, 12],
       [50, 51, 52],
       [60, 61, 62]])

In [22]: z.flat[:] # 使用flat方法也能實(shí)現(xiàn)
Out[22]: array([ 0,  1,  2, 10, 11, 12, 50, 51, 52, 60, 61, 62])

In [23]: z.flat # 此時(shí)返回一個(gè)迭代器
Out[23]: <numpy.flatiter at 0x7fa602180a00>

In [24]: list(z.flat)
Out[24]: [0, 1, 2, 10, 11, 12, 50, 51, 52, 60, 61, 62]

In [25]: z.ravel()
Out[25]: array([ 0,  1,  2, 10, 11, 12, 50, 51, 52, 60, 61, 62])

In [26]: z # ravel方法不影響原數(shù)組
Out[26]: 
array([[ 0,  1,  2],
       [10, 11, 12],
       [50, 51, 52],
       [60, 61, 62]])

astype

astype實(shí)現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換

In [77]: a = ones([5, 4])

In [78]: a
Out[78]: 
array([[ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.]])

In [79]: a.astype(int)
Out[79]: 
array([[1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1]])

In [80]: a
Out[80]: 
array([[ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.]])

In [81]: a.dtype
Out[81]: dtype('float64')

# 不能直接改變dtype進(jìn)行類型轉(zhuǎn)換
In [82]: a.dtype = 'int'

In [83]: a
Out[83]: 
array([[4607182418800017408, 4607182418800017408, 4607182418800017408,
        4607182418800017408],
       [4607182418800017408, 4607182418800017408, 4607182418800017408,
        4607182418800017408],
       [4607182418800017408, 4607182418800017408, 4607182418800017408,
        4607182418800017408],
       [4607182418800017408, 4607182418800017408, 4607182418800017408,
        4607182418800017408],
       [4607182418800017408, 4607182418800017408, 4607182418800017408,
        4607182418800017408]])
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末墙杯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子括荡,更是在濱河造成了極大的恐慌高镐,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畸冲,死亡現(xiàn)場離奇詭異嫉髓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)邑闲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門算行,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人苫耸,你說我怎么就攤上這事州邢。” “怎么了褪子?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵量淌,是天一觀的道長。 經(jīng)常有香客問我嫌褪,道長呀枢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任渔扎,我火速辦了婚禮硫狞,結(jié)果婚禮上信轿,老公的妹妹穿的比我還像新娘晃痴。我一直安慰自己,他們只是感情好财忽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布倘核。 她就那樣靜靜地躺著,像睡著了一般即彪。 火紅的嫁衣襯著肌膚如雪紧唱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天隶校,我揣著相機(jī)與錄音漏益,去河邊找鬼。 笑死深胳,一個(gè)胖子當(dāng)著我的面吹牛绰疤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舞终,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼轻庆,長吁一口氣:“原來是場噩夢啊……” “哼癣猾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起余爆,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纷宇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蛾方,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體像捶,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年桩砰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了作岖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡五芝,死狀恐怖痘儡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情枢步,我是刑警寧澤沉删,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站醉途,受9級特大地震影響矾瑰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜隘擎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一殴穴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧货葬,春花似錦采幌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蹲姐,卻和暖如春磨取,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柴墩。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工忙厌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人江咳。 一個(gè)月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓逢净,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子汹胃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容