numpy基礎(chǔ)入門

import numpy as np

1. 矩陣的創(chuàng)建

a=np.arange(1,5)
a=np.array([1,2,3,4,5])
print(a, a.dtype, a.shape, a.size, a.ndim)
[1 2 3 4 5] int64 (5,) 5 1
  • np.arange類似range函數(shù)
  • np.array用來生成矩陣
  • dtype是數(shù)據(jù)類型,有int64, complex, uint16等
  • shape是個元組屬性,表示每一維的寬度
  • size是所有元素個數(shù)
  • ndim是維數(shù)
b=np.array([1,2,3],dtype='int') # int64, complex, uint16......
h = b.astype(np.float)  # 用另一種類型表示
print(b, b.dtype, h.dtype)
[1 2 3] int64 float64
m=np.array([np.arange(6),np.arange(6)])
print(m, m.shape, m.size)
[[0 1 2 3 4 5]
 [0 1 2 3 4 5]] (2, 6) 12
# 每一個[]代表一維,比如
# [[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]], 代表矩陣的維度是(2,2,3)
# 其中第一個2,代表最外層的兩個[]涨缚,第二個2代表第二層[],第三個3代表最里層的維度。
n=np.array([[1,2,3,4],[5,6,7,8]])
print(n, n[0,2], n[1,1])

m=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
print(m.shape)
[[1 2 3 4]
 [5 6 7 8]] 3 6
(2, 2, 3)
x=m.ravel()
y=n.flatten()
print(x)
print(y)
[ 1  2  3  4  5  6  7  8  9 10 11 12]
[1 2 3 4 5 6 7 8]

ravel()和flatten()看起來效果一樣彬犯,都是把矩陣展平了向楼。它們的區(qū)別在于

  • ravel()返回的是原有數(shù)據(jù)的一個映射(view),沒有分配新的存儲
  • flatten()返回的是新的數(shù)據(jù)
    因此如果我們改變它們的值谐区,就可以看出區(qū)別

numpy還有一些函數(shù)有這樣的區(qū)別湖蜕,關(guān)鍵在于判斷函數(shù)返回是原數(shù)據(jù)的映射還是返回新的數(shù)據(jù)。

x[3]=10;y[3]=10
print(m)
print(n)
# 看看m宋列,n哪個的值改變了
[[[ 1  2  3]
  [10  5  6]]

 [[ 7  8  9]
  [10 11 12]]]
[[1 2 3 4]
 [5 6 7 8]]
# reshape返回一個view
x=m.reshape(3,4)
# resize直接在當(dāng)前數(shù)據(jù)上更改昭抒,返回空
y=n.resize(3,4)
print(x,y,'\n',n)
[[ 1  2  3 10]
 [ 5  6  7  8]
 [ 9 10 11 12]] None 
 [[1 2 3 4]
 [5 6 7 8]
 [0 0 0 0]]
x[2]=10
print(x, m)
# 看看m和n哪個改變了,有什么區(qū)別
[[ 1  2  3 10]
 [ 5  6  7  8]
 [10 10 10 10]] [[[ 1  2  3]
  [10  5  6]]

 [[ 7  8 10]
  [10 10 10]]]
m=np.array([np.arange(6),np.arange(6)])
# copy()可以強制返回一個新的數(shù)據(jù)
x=m.reshape(3,4).copy()
x[2]=10;print(x);print(m)
#看看這次m的值隨x改變而改變嗎
# linspace返回0,1之間的10個數(shù)據(jù)炼杖,等差數(shù)列
x=np.linspace(0,1,10)
print(x)
[ 0.          0.11111111  0.22222222  0.33333333  0.44444444  0.55555556
  0.66666667  0.77777778  0.88888889  1.        ]
a = np.arange(10)
np.random.shuffle(a)  # 隨機排第一維
print(a)

a = np.arange(9).reshape((3, 3)) # 隨機排第一維灭返,想一想結(jié)果是什么
np.random.shuffle(a)
print(a)
[1 5 0 6 4 7 3 2 9 8]
[[3 4 5]
 [6 7 8]
 [0 1 2]]
# 全0矩陣
a=np.zeros((3,3))
# 全1矩陣
b=np.ones((5,4))
# 單位矩陣
c=np.eye(3)
# 取對角元素
print(b)
np.diag(b) # np.diag(b) 返回b的對角線元素
[[ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]
 [ 1.  1.  1.  1.]]
[3 3 3 3]
print(m.transpose()) # 轉(zhuǎn)秩
print(m.T) # 轉(zhuǎn)秩
[[[ 1  7]
  [10 10]]

 [[ 2  8]
  [ 5 10]]

 [[ 3 10]
  [ 6 10]]]
[[[ 1  7]
  [10 10]]

 [[ 2  8]
  [ 5 10]]

 [[ 3 10]
  [ 6 10]]]

2.索引

a = np.arange(24).reshape((2, 3, 4))

# 用:表示當(dāng)前維度上所有下標
c = a[:, 2, :]
d = a[:, :, 1]
e = a[:, 1:, 1:-1]

# 用...表示沒有明確指出的維度
f = a[..., 1] # 等價于[:, :, 1]

print(a)
print(c)
print(d)
print(e)
print(f)
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
[[ 8  9 10 11]
 [20 21 22 23]]
[[ 1  5  9]
 [13 17 21]]
[[[ 5  6]
  [ 9 10]]

 [[17 18]
  [21 22]]]
[[ 1  5  9]
 [13 17 21]]

3. 矩陣的加法

a = np.arange(9).reshape((3, 3))

## 每個元素的broadcast
print(a)
print(a+3)

## 行broadcast
print(a+np.arange(3))

## 列broadcast
print(a+np.arange(3).reshape(3,1))
[[0 1 2]
 [3 4 5]
 [6 7 8]]
[[ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
[[ 0  2  4]
 [ 3  5  7]
 [ 6  8 10]]
[[ 0  1  2]
 [ 4  5  6]
 [ 8  9 10]]

broadcast廣播操作,運算不僅僅作用在某個元素嘹叫,而是作用在整個矩陣婆殿,或者整行,或者整列罩扇。
比如

  • nm + 11 就是將11的元素作用在nm的整個矩陣
  • nm + n1 就是將n1的元素作用在nm的每一列
  • nm + 1m 就是將1m的元素作用在nm的每一行
  • 乘法類似
a = np.array([[1, 2], [3, 4]])
print(np.sum(a,axis=0))
print(np.sum(a,axis=1))
print(np.mean(a,axis=0))
print(np.mean(a,axis=1))
print(np.std(a,axis=0)) # 標準差

#axis=0婆芦,就是按第一個維度進行計算,行向量[1,2], [3,4]
#axis=1,就是按第二個維度進行計算雏节,列向量[1,3], [2,4]
[4 6]
[3 7]
[ 2.  3.]
[ 1.5  3.5]
[ 1.  1.]
#再拓展到3維
a = np.arange(12).reshape((2,2,3))
print(a)
print(np.sum(a,axis=0)) #按第一維度加孩锡,結(jié)果為2*3矩陣, 可以理解為1*2*3
print(np.sum(a,axis=1))#按第二維度加,結(jié)果為2*3矩陣, 可以理解為2*1*3
print(np.sum(a,axis=2)) #按第三維度加或粮,結(jié)果為2*2矩陣, 可以理解為2*2*1
[[[ 0  1  2]
  [ 3  4  5]]

 [[ 6  7  8]
  [ 9 10 11]]]
[[ 6  8 10]
 [12 14 16]]
[[ 3  5  7]
 [15 17 19]]
[[ 3 12]
 [21 30]]

4. 矩陣的乘法

a = np.arange(12).reshape((6, 2))
b = np.arange(10).reshape((2,5))

# 兩種矩陣乘法形式
print(a.dot(b))
print(np.dot(a,b))
[[  5   6   7   8   9]
 [ 15  20  25  30  35]
 [ 25  34  43  52  61]
 [ 35  48  61  74  87]
 [ 45  62  79  96 113]
 [ 55  76  97 118 139]]
[[  5   6   7   8   9]
 [ 15  20  25  30  35]
 [ 25  34  43  52  61]
 [ 35  48  61  74  87]
 [ 45  62  79  96 113]
 [ 55  76  97 118 139]]
## 每個元素broadcast
print(a*2)
[[ 0  2]
 [ 4  6]
 [ 8 10]
 [12 14]
 [16 18]
 [20 22]]
# 行broadcast
print(a*[1,2])
[[ 0  2]
 [ 2  6]
 [ 4 10]
 [ 6 14]
 [ 8 18]
 [10 22]]
# 列broadcast
print(a*np.arange(6).reshape(6,1))

5.矩陣的拼接和拆分

a = np.arange(9).reshape(3,3)
b = 2 * a
c = np.hstack((a, b)) # 以面向列的方式進行堆疊(axis=1)
print(c)
[[ 0  1  2  0  2  4]
 [ 3  4  5  6  8 10]
 [ 6  7  8 12 14 16]]
print(np.concatenate((a, b), axis=1))
[[ 0  1  2  0  2  4]
 [ 3  4  5  6  8 10]
 [ 6  7  8 12 14 16]]
c=np.vstack((a, b)) # 以面向行的方式進行堆疊(axis=0)
c=np.concatenate((a, b), axis=0)
# hsplit, vsplit, dsplit 分別沿軸0,1,2進行拆分
print(np.hsplit(a, 3)) 
print(np.vsplit(a,3))
[array([[0],
       [3],
       [6]]), array([[1],
       [4],
       [7]]), array([[2],
       [5],
       [8]])]
[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
# 平均分成3份
g = np.split(np.arange(9), 3)

# 按照下標位置進行劃分
h = np.split(np.arange(9), [2, -3])
print(g)
print(h)
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
[array([0, 1]), array([2, 3, 4, 5]), array([6, 7, 8])]
  • hsplit, vsplit, dsplit 分別沿軸0,1,2進行拆分
  • hstack, vstack, dstack 分別以面向列(1),行(0)捞高,深度(2)的方式進行堆疊
  • row_stack, column_stack 分別以面向列(1)氯材,行(0)的方式進行堆疊
  • np.r_, np.c_ 分別以面向列(1),行(0)的方式進行堆疊

6. 矩陣的查找

a = np.arange(12).reshape((3, 4))
b = a%2==0
c = a>4
print(b)
print (c)
# 這里也用到了broadcast
[[ True False  True False]
 [ True False  True False]
 [ True False  True False]]
[[False False False False]
 [False  True  True  True]
 [ True  True  True  True]]
a = np.arange(12).reshape((3, 4))
print(a)
print(np.argmax(a))
# 其實是列broadcast硝岗,返回每列最大值的idx
print(np.argmax(a, axis=0))

# 行broadcast氢哮,返回每行最大值的idx
print(np.argmax(a, axis=1))
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
11
[2 2 2 2]
[3 3 3]
# np.where支持多個邏輯組合, 得到滿足條件的index
idx=np.where((a>3))
print(a[idx])

idx=np.where((a>3)&(a<7))
print(a[idx])
[ 4  5  6  7  8  9 10 11]
[4 5 6]

7. 元素的重復(fù)操作:tile和repeat

# repeat會將數(shù)組中元素重復(fù)一定次數(shù)
a = np.repeat(3, 4) # 創(chuàng)建一個一維數(shù)組,元素值是把3重復(fù)4次型檀,array([3, 3, 3, 3])

b = np.arange(3)
c = b.repeat(4) # 如果傳入一個整數(shù)冗尤,則把每個元素重復(fù)多次
d = b.repeat([2,3,4]) # 如果傳入一組整數(shù), 則把個元素重復(fù)不同次數(shù)

e = np.arange(6).reshape(2,3)
f = e.repeat(2, axis=1) # 對于多維數(shù)組還可以沿指定軸重復(fù)
g = e.repeat([2, 3], axis=0)
print(a)
print(c)
print(d)
print(f)
print(g)

# tile會沿指定軸向堆疊數(shù)組的副本
h1 = np.tile(e, 2) # 對于標量按照水平鋪設(shè)
h2 = np.tile(e, (2, 3)) # 對于原則則按照縱向和橫向分別鋪設(shè)
print(h1)
print(h2)
[3 3 3 3]
[0 0 0 0 1 1 1 1 2 2 2 2]
[0 0 1 1 1 2 2 2 2]
[[0 0 1 1 2 2]
 [3 3 4 4 5 5]]
[[0 1 2]
 [0 1 2]
 [3 4 5]
 [3 4 5]
 [3 4 5]]
[[0 1 2 0 1 2]
 [3 4 5 3 4 5]]
[[0 1 2 0 1 2 0 1 2]
 [3 4 5 3 4 5 3 4 5]
 [0 1 2 0 1 2 0 1 2]
 [3 4 5 3 4 5 3 4 5]]

8. 隨機模塊(random)

import numpy as np
import numpy.random as random

# 設(shè)置隨機數(shù)種子
random.seed(42)

# 產(chǎn)生一個1x3,[0,1)之間的浮點型隨機數(shù)
random.rand(1, 3)

# 產(chǎn)生一個[0,1)之間的浮點型隨機數(shù)
random.random()

# 下邊4個沒有區(qū)別胀溺,都是按照指定大小產(chǎn)生[0,1)之間的浮點型隨機數(shù)array裂七,不Pythonic…
random.random((3, 3))
random.sample((3, 3))
random.random_sample((3, 3))
random.ranf((3, 3))

# 產(chǎn)生10個[1,6)之間的浮點型隨機數(shù)
5*random.random(10) + 1
random.uniform(1, 6, 10)

# 產(chǎn)生指定形狀的隨機數(shù)
random.randint(1, 6, 10)
random.randint(1, 6, size=(3,3))

# 產(chǎn)生2x5的標準正態(tài)分布樣本
random.normal(size=(5, 2))

# 產(chǎn)生5個,n=5仓坞,p=0.5的二項分布樣本
random.binomial(n=5, p=0.5, size=5)

a = np.arange(10)

# 從a中有回放的隨機采樣7個
random.choice(a, 7)

# 從a中無回放的隨機采樣7個
random.choice(a, 7, replace=False)

# 對a進行亂序并返回一個新的array
b = random.permutation(a)

# 對a進行in-place亂序
random.shuffle(a)

# 生成一個長度為9的隨機bytes序列并作為str返回
# '\x96\x9d\xd1?\xe6\x18\xbb\x9a\xec'
random.bytes(9)

9. numpy 100題

http://www.labri.fr/perso/nrougier/teaching/numpy.100/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末背零,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子无埃,更是在濱河造成了極大的恐慌徙瓶,老刑警劉巖蝎困,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異倍啥,居然都是意外死亡禾乘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門虽缕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來始藕,“玉大人,你說我怎么就攤上這事氮趋∥榕桑” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵剩胁,是天一觀的道長诉植。 經(jīng)常有香客問我,道長昵观,這世上最難降的妖魔是什么晾腔? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮啊犬,結(jié)果婚禮上灼擂,老公的妹妹穿的比我還像新娘。我一直安慰自己觉至,他們只是感情好剔应,可當(dāng)我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著语御,像睡著了一般峻贮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上应闯,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天纤控,我揣著相機與錄音,去河邊找鬼孽锥。 笑死嚼黔,一個胖子當(dāng)著我的面吹牛细层,可吹牛的內(nèi)容都是我干的惜辑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼疫赎,長吁一口氣:“原來是場噩夢啊……” “哼盛撑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捧搞,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤抵卫,失蹤者是張志新(化名)和其女友劉穎狮荔,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體介粘,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡殖氏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了姻采。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雅采。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖慨亲,靈堂內(nèi)的尸體忽然破棺而出婚瓜,到底是詐尸還是另有隱情,我是刑警寧澤刑棵,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布巴刻,位于F島的核電站,受9級特大地震影響蛉签,放射性物質(zhì)發(fā)生泄漏胡陪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一碍舍、第九天 我趴在偏房一處隱蔽的房頂上張望督弓。 院中可真熱鬧,春花似錦乒验、人聲如沸愚隧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狂塘。三九已至,卻和暖如春鳄厌,著一層夾襖步出監(jiān)牢的瞬間荞胡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工了嚎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泪漂,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓歪泳,卻偏偏與公主長得像萝勤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子呐伞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,492評論 2 348

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

  • 通用函數(shù)ufunc 一元ufunc舉例:1敌卓、abs、fabs:計算絕對值,fabs更快2伶氢、sqrt:計算各元素的平...
    xingzhui閱讀 412評論 0 0
  • 來源:NumPy Tutorial - TutorialsPoint 譯者:飛龍 協(xié)議:CC BY-NC-SA 4...
    布客飛龍閱讀 32,720評論 6 96
  • 一趟径、引入Numpy 默認的方式是:import numpy as np一般不推薦采用其他方式瘪吏,上面是默認的方法。 ...
    xingzhui閱讀 338評論 0 1
  • NumPy 內(nèi)置了進行數(shù)據(jù)分析時所要執(zhí)行的大量基礎(chǔ)任務(wù)所需的函數(shù) 一維數(shù)組蜗巧、二維數(shù)組 輸出結(jié)果為: 從數(shù)組中取值 ...
    拙峰朽木閱讀 221評論 0 3
  • Numpy是Python的第第三方模塊掌眠,用于科學(xué)計算。 1.屬性 列表轉(zhuǎn)化為數(shù)組: 2. array的創(chuàng)建 指定數(shù)...
    井底蛙蛙呱呱呱閱讀 3,354評論 0 10