Python之numpy教程(二):運(yùn)算贸伐、索引、切片

1.numpy數(shù)組的特點(diǎn)在于怔揩,大小相等的數(shù)組之間捉邢,任何算數(shù)運(yùn)算都會將運(yùn)算應(yīng)用到元素級
請看下面的例子:

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr = np.array([[1.,2.,3.],[4.,5.,6.]])
arr

輸出:
array([[ 1., 2., 3.], [ 4., 5., 6.]])
[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr * arr

輸出:

array([[ 1., 4., 9.], [ 16., 25., 36.]])
[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr - arr

輸出:

array([[ 0., 0., 0.], [ 0., 0., 0.]])
[python] view plain copy

派生到我的代碼片
派生到我的代碼片

1 / arr

輸出:

array([[ 1. , 0.5 , 0.33333333], [ 0.25 , 0.2 , 0.16666667]])
[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr ** 0.5

輸出:

array([[ 1. , 1.41421356, 1.73205081], [ 2. , 2.23606798, 2.44948974]])
2.數(shù)據(jù)索引:Python是從0的位置開始

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr = np.arange(10)
arr

輸出:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr[5]

輸出:
5

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr[5:8]

輸出:

array([5, 6, 7])
3.索引位置可以用來更改數(shù)組值

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr[5:8] = 12

輸出:

array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])

4.從上面可以看出沧踏,跟列表最重要的區(qū)別是歌逢,數(shù)組切片是原始數(shù)組的視圖。這意味著數(shù)據(jù)不會被復(fù)制翘狱,任何修改都會直接反映到源數(shù)組上

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr_slice = arr[5:8]
arr_slice[1] = 12345

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr

輸出:

array([ 0, 1, 2, 3, 4, 12, 12345, 12, 8, 9])
[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr_slice[:] = 64

輸出:

array([ 0, 1, 2, 3, 4, 64, 64, 64, 8, 9])
5.如果你不要改變原始數(shù)組秘案,需要復(fù)制一份,可以這樣操作:

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr_copy = arr[5:8].copy()

6.對于高維數(shù)組潦匈,索引位置上的元素不再是標(biāo)量而是低一維的數(shù)組阱高,比如:

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr2d[2]

輸出:

array([7, 8, 9])
7.對于高維數(shù)組,索引元素需要進(jìn)行遞歸訪問茬缩,可以傳入一個以逗號隔開的索引列表來獲取單個元素赤惊。

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr2d[0][2]

輸出:
3
[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr2d[0,2]

輸出:
3以上兩種方法是等價(jià)的。

8.二維數(shù)組還比較容易理解凰锡,下面看一個三維數(shù)組的例子:
[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr3d = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
arr3d

輸出:

array([[[ 1, 2, 3], [ 4, 5, 6]], [[ 7, 8, 9], [10, 11, 12]]])
這是一個(2×2×3)的數(shù)組未舟,可以通過運(yùn)行arr3d.shape進(jìn)行驗(yàn)證。

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr3d[0]

輸出:

array([[1, 2, 3], [4, 5, 6]])
[python] view plain copy

派生到我的代碼片
派生到我的代碼片

old_values = arr3d[0].copy()
arr3d[0]= 42
arr3d

輸出:

array([[[42, 42, 42], [42, 42, 42]], [[ 7, 8, 9], [10, 11, 12]]])
[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr3d[0]= old_values
arr3d

輸出:

array([[[ 1, 2, 3], [ 4, 5, 6]], [[ 7, 8, 9], [10, 11, 12]]])
[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr3d[1,0]

輸出:

array([7, 8, 9])
9.再看幾個二維數(shù)組的索引例子掂为,用剛才創(chuàng)建的那個arr2d數(shù)組裕膀,注意索引位置包括開頭但不包括結(jié)尾,比如[0:2]是索引1勇哗、2位置昼扛,但沒有3。

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr2d

輸出:
array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr2d[:2]

輸出:

array([[1, 2, 3], [4, 5, 6]])
注意沒有第三個元素欲诺,也就是arr2d[2]

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr2d[:2,1:]

輸出:

array([[2, 3], [5, 6]])
[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr2d[1,:2]

輸出:array([4, 5]

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr2d[2,:1]

輸出:

array([7])
[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr2d[:,:1]

輸出:

array([[1], [4], [7]])
[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr2d[:2,1:] = 0
arr2d

輸出:

array([[1, 0, 0], [4, 0, 0], [7, 8, 9]])
可以借助下圖來理解:

10.布爾型索引

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
names

輸出:

array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='<U4')
生產(chǎn)一組隨機(jī)數(shù)組

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

import numpy.random
data = numpy.random.randn(7,4)
data

輸出:

array([[ 0.98990731, -0.26694924, 1.17834132, -0.21712539], [ 1.10877471, 0.04496048, 0.99851866, -0.65930485], [ 0.20479382, -0.09918733, -0.51451222, 1.43864803], [-0.30217902, 1.20441035, -0.88069583, -0.31243213], [-1.47970158, 0.08452533, -1.56347609, 1.88383865], [ 0.45802479, 0.84710767, -1.87281658, 0.90212452], [ 0.57361001, 0.61528872, 1.25977742, -0.06899717]])
判斷抄谐,產(chǎn)生一個布爾型數(shù)組
[python] view plain copy

派生到我的代碼片
派生到我的代碼片

names == 'Bob'

輸出:

array([ True, False, False, True, False, False, False], dtype=bool)

這個布爾型數(shù)組可以用于數(shù)組索引[python] view plain copy

派生到我的代碼片
派生到我的代碼片

data[names == 'Bob']

輸出:array([[ 0.98990731, -0.26694924, 1.17834132, -0.21712539], [-0.30217902, 1.20441035, -0.88069583, -0.31243213]])
可以將布爾型數(shù)組跟切片、整數(shù)混合使用
[python] view plain copy

派生到我的代碼片
派生到我的代碼片

data[names == 'Bob',2:]

輸出:

array([[ 1.17834132, -0.21712539], [-0.88069583, -0.31243213]])
[python] view plain copy

派生到我的代碼片
派生到我的代碼片

data[names == 'Bob',3]

輸出:

array([-0.21712539, -0.31243213])
也可以用不等號(扰法!=)進(jìn)行或者符號(-)對條件進(jìn)行否定索引

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

names != 'Bob'

輸出:

array([False, True, True, False, True, True, True], dtype=bool)
[python] view plain copy

派生到我的代碼片
派生到我的代碼片

data[-(names == 'Bob')]

輸出:

array([[ 1.10877471, 0.04496048, 0.99851866, -0.65930485], [ 0.20479382, -0.09918733, -0.51451222, 1.43864803], [-1.47970158, 0.08452533, -1.56347609, 1.88383865], [ 0.45802479, 0.84710767, -1.87281658, 0.90212452], [ 0.57361001, 0.61528872, 1.25977742, -0.06899717]])
11.也可以使用多個布爾型條件進(jìn)行索引蛹含,這在實(shí)際操作中十分常見

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

mask = (names == 'Bob')|(names == 'Will')
mask

輸出:

array([ True, False, True, True, True, False, False], dtype=bool)
[python] view plain copy

派生到我的代碼片
派生到我的代碼片

data[mask]

輸出:

array([[ 0.98990731, -0.26694924, 1.17834132, -0.21712539], [ 0.20479382, -0.09918733, -0.51451222, 1.43864803], [-0.30217902, 1.20441035, -0.88069583, -0.31243213], [-1.47970158, 0.08452533, -1.56347609, 1.88383865]])
把小于0的數(shù)都變?yōu)?

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

data[data < 0] = 0
data

輸出:

array([[ 0.98990731, 0. , 1.17834132, 0. ], [ 1.10877471, 0.04496048, 0.99851866, 0. ], [ 0.20479382, 0. , 0. , 1.43864803], [ 0. , 1.20441035, 0. , 0. ], [ 0. , 0.08452533, 0. , 1.88383865], [ 0.45802479, 0.84710767, 0. , 0.90212452], [ 0.57361001, 0.61528872, 1.25977742, 0. ]])
[python] view plain copy

派生到我的代碼片
派生到我的代碼片

data[names != 'Joe'] = 7
data

輸出:

array([[ 7. , 7. , 7. , 7. ], [ 1.10877471, 0.04496048, 0.99851866, 0. ], [ 7. , 7. , 7. , 7. ], [ 7. , 7. , 7. , 7. ], [ 7. , 7. , 7. , 7. ], [ 0.45802479, 0.84710767, 0. , 0.90212452], [ 0.57361001, 0.61528872, 1.25977742, 0. ]])
11.花式索引:
花式索引(Fancy indexing)是一個Numpy術(shù)語,它指的是利用整數(shù)數(shù)組進(jìn)行索引塞颁。
先建立一個8×4的empty數(shù)組

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr = np.empty((8,4))
arr

輸出:

array([[ 2.27764263e-321, 0.00000000e+000, 3.65717707e-316, 0.00000000e+000], [ 0.00000000e+000, 2.50223420e-315, 0.00000000e+000, 4.42980404e-316], [ 0.00000000e+000, 3.61995693e-316, 2.50223420e-315, 4.43565180e-316], [ 2.50097935e-315, 4.59507256e-316, 0.00000000e+000, 0.00000000e+000], [ 0.00000000e+000, 0.00000000e+000, 4.42208160e-316, 0.00000000e+000], [ 3.65629171e-316, 1.98465379e-317, 2.50224669e-315, 2.63675246e-316], [ 0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000], [ 2.50224384e-315, 0.00000000e+000, 0.00000000e+000, 4.59490260e-316]])
給其賦值

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

for i in range(8):
arr[i] = i
arr

輸出:

array([[ 0., 0., 0., 0.], [ 1., 1., 1., 1.], [ 2., 2., 2., 2.], [ 3., 3., 3., 3.], [ 4., 4., 4., 4.], [ 5., 5., 5., 5.], [ 6., 6., 6., 6.], [ 7., 7., 7., 7.]])
特定的順序選取行子集挣惰,只需傳入一個用于指定順序的整數(shù)列表或ndarray:

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr[[4,3,0,6]]

輸出:

array([[ 4., 4., 4., 4.], [ 3., 3., 3., 3.], [ 0., 0., 0., 0.], [ 6., 6., 6., 6.]])

使用負(fù)數(shù)索引會從末尾開始:

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr[[-3,-5,-7]]

輸出:

array([[ 5., 5., 5., 5.], [ 3., 3., 3., 3.], [ 1., 1., 1., 1.]])
使用reshape函數(shù)改變行列數(shù)

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr = np.arange(32).reshape((8,4))
arr

輸出:

array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23], [24, 25, 26, 27], [28, 29, 30, 31]])
[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr[[1,5,7,2],[0,3,1,2]]

輸出:

array([ 4, 23, 29, 10])
可以看出卧斟,最終選出的元素是(1,0)、(5,3)憎茂、(7,1)、(2,2)

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr[[1,5,7,2]][:,[0,3,1,2]]

輸出:

array([[ 4, 7, 5, 6], [20, 23, 21, 22], [28, 31, 29, 30], [ 8, 11, 9, 10]])
另外一個辦法是使用np.ix_函數(shù)锤岸,它可以將兩個一維整數(shù)數(shù)組轉(zhuǎn)換為一個用于選取方形區(qū)域的索引器

[python] view plain copy

派生到我的代碼片
派生到我的代碼片

arr[np.ix_([1,5,7,2],[0,3,1,2])]

輸出:

array([[ 4, 7, 5, 6], [20, 23, 21, 22], [28, 31, 29, 30], [ 8, 11, 9, 10]])
注意:花式索引跟切片不一樣竖幔,它總是將數(shù)據(jù)復(fù)制到新數(shù)組中

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末是偷,一起剝皮案震驚了整個濱河市拳氢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛋铆,老刑警劉巖馋评,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異刺啦,居然都是意外死亡留特,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門玛瘸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜕青,“玉大人,你說我怎么就攤上這事糊渊∮液耍” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵渺绒,是天一觀的道長贺喝。 經(jīng)常有香客問我,道長宗兼,這世上最難降的妖魔是什么躏鱼? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮针炉,結(jié)果婚禮上挠他,老公的妹妹穿的比我還像新娘。我一直安慰自己篡帕,他們只是感情好殖侵,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著镰烧,像睡著了一般拢军。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上怔鳖,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天茉唉,我揣著相機(jī)與錄音,去河邊找鬼。 笑死度陆,一個胖子當(dāng)著我的面吹牛艾凯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播懂傀,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼趾诗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蹬蚁?” 一聲冷哼從身側(cè)響起恃泪,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎犀斋,沒想到半個月后贝乎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叽粹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年览效,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片球榆。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡朽肥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出持钉,到底是詐尸還是另有隱情衡招,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布每强,位于F島的核電站始腾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏空执。R本人自食惡果不足惜浪箭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辨绊。 院中可真熱鬧奶栖,春花似錦、人聲如沸门坷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽默蚌。三九已至冻晤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绸吸,已是汗流浹背鼻弧。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工设江, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人攘轩。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓叉存,卻偏偏與公主長得像,于是被迫代替她去往敵國和親度帮。 傳聞我的和親對象是個殘疾皇子鹉胖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

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