最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python 機(jī)器學(xué)習(xí)庫(kù) NumPy入門(mén)教程

 更新時(shí)間:2018年04月19日 09:32:00   作者:只為那傳說(shuō)中美麗的草原  
在我們使用Python語(yǔ)言進(jìn)行機(jī)器學(xué)習(xí)編程的時(shí)候,這是一個(gè)非常常用的基礎(chǔ)庫(kù)。本文針對(duì)Python 機(jī)器學(xué)習(xí)庫(kù) NumPy入門(mén)教程,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧

NumPy是一個(gè)Python語(yǔ)言的軟件包,它非常適合于科學(xué)計(jì)算。在我們使用Python語(yǔ)言進(jìn)行機(jī)器學(xué)習(xí)編程的時(shí)候,這是一個(gè)非常常用的基礎(chǔ)庫(kù)。

本文是對(duì)它的一個(gè)入門(mén)教程。

介紹

NumPy是一個(gè)用于科技計(jì)算的基礎(chǔ)軟件包,它是Python語(yǔ)言實(shí)現(xiàn)的。它包含了:

  • 強(qiáng)大的N維數(shù)組結(jié)構(gòu)
  • 精密復(fù)雜的函數(shù)
  • 可集成到C/C++和Fortran代碼的工具
  • 線性代數(shù),傅里葉變換以及隨機(jī)數(shù)能力

除了科學(xué)計(jì)算的用途以外,NumPy也可被用作高效的通用數(shù)據(jù)的多維容器。由于它適用于任意類(lèi)型的數(shù)據(jù),這使得NumPy可以無(wú)縫和高效的集成到多種類(lèi)型的數(shù)據(jù)庫(kù)中。

獲取NumPy

由于這是一個(gè)Python語(yǔ)言的軟件包,因此需要你的機(jī)器上首先需要具備Python語(yǔ)言的環(huán)境。關(guān)于這一點(diǎn),請(qǐng)自行在網(wǎng)絡(luò)上搜索獲取方法。

關(guān)于如何獲取NumPy也請(qǐng)參閱scipy.org官網(wǎng)上的Installing packages。本文不再贅述。

筆者推薦使用pip的方式安裝Python包,命令如下:

pip3 install numpy

本文的代碼在如下的環(huán)境中驗(yàn)證和測(cè)試:

  • 硬件:MacBook Pro 2015
  • OS:macOS High Sierra
  • 語(yǔ)言環(huán)境:Python 3.6.2
  • 軟件包:numpy 1.13.3

可以在這里獲取到本文的所有源碼:https://github.com/paulQuei/numpy_tutorial

另外,

  • 為了簡(jiǎn)單起見(jiàn),本文我們會(huì)通過(guò)Python的print函數(shù)來(lái)進(jìn)行結(jié)果的驗(yàn)證
  • 為了拼寫(xiě)方便,我們會(huì)默認(rèn)import numpy as np

基礎(chǔ)屬性與數(shù)組創(chuàng)建

NumPy的基礎(chǔ)是一個(gè)同構(gòu)的多維數(shù)據(jù),數(shù)組中的元素可以通過(guò)下標(biāo)來(lái)索引。在NumPy中,維度稱之為axis(復(fù)數(shù)是axes),維度的數(shù)量稱之為rank。

例如:

下面是一個(gè)具有rank 1的數(shù)組,axis的長(zhǎng)度為3:

[1, 2, 3]

下面是一個(gè)具有rank 2的數(shù)組,axis的長(zhǎng)度也是3:

[[ 1, 2, 3],
 [ 4, 5, 6]]

我們可以通過(guò)array函數(shù)來(lái)創(chuàng)建NumPy的數(shù)組,例如這樣:

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

請(qǐng)注意,這里方括號(hào)是必須的,下面這種寫(xiě)法是錯(cuò)誤的:

a = np.array(1,2,3,4) # WRONG!!!

NumPy的數(shù)組類(lèi)是ndarray,它有一個(gè)別名是 numpy.array,但這與Python標(biāo)準(zhǔn)庫(kù)的array.array并不一樣。后者僅僅是一個(gè)一維數(shù)組。而ndarray具有以下的屬性:

  • ndarray.ndim:數(shù)組的維數(shù)。在Python世界中,維數(shù)稱之為rank
  • ndarray.shape:數(shù)組的維度。這是一系列數(shù)字,長(zhǎng)度由數(shù)組的維度(ndim)決定。例如:長(zhǎng)度為n的一維數(shù)組的shape是n。一個(gè)n行m列的矩陣的shape是n,m
  • ndarray.size:數(shù)組中所有元素的數(shù)量
  • ndarray.dtype:數(shù)組中元素的類(lèi)型,例如numpy.int32, numpy.int16或者numpy.float64
  • ndarray.itemsize:數(shù)組中每個(gè)元素的大小,單位為字節(jié)
  • ndarray.data:存儲(chǔ)數(shù)組元素的緩沖。通常我們只需要通過(guò)下標(biāo)來(lái)訪問(wèn)元素,而不需要訪問(wèn)緩沖

下面我們來(lái)看一下代碼示例:

# create_array.py

import numpy as np

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

print('a=')
print(a)
print("a's ndim {}".format(a.ndim))
print("a's shape {}".format(a.shape))
print("a's size {}".format(a.size))
print("a's dtype {}".format(a.dtype))
print("a's itemsize {}".format(a.itemsize))
print('')
print('b=')
print(b)
print("b's ndim {}".format(b.ndim))
print("b's shape {}".format(b.shape))
print("b's size {}".format(b.size))
print("b's dtype {}".format(b.dtype))
print("b's itemsize {}".format(b.itemsize))

下面是這段代碼的輸出:

a=
[1 2 3]
a's ndim 1
a's shape (3,)
a's size 3
a's dtype int64
a's itemsize 8
b=
[[1 2 3]
 [4 5 6]]
b's ndim 2
b's shape (2, 3)
b's size 6
b's dtype int64
b's itemsize 8

我們也可以在創(chuàng)建數(shù)組的時(shí)候,指定元素的類(lèi)型,例如這樣:

c = np.array( [ [1,2], [3,4] ], dtype=complex )

關(guān)于array函數(shù)的更多參數(shù)說(shuō)明,請(qǐng)參見(jiàn)這里:numpy.array

注:NumPy本身支持多維數(shù)組,也支持各種類(lèi)型元素的數(shù)據(jù)。但考慮到,三維及以上的數(shù)組結(jié)構(gòu)并不容易理解,而且我們?cè)谶M(jìn)行機(jī)器學(xué)習(xí)編程的時(shí)候,用的最多的是矩陣運(yùn)算。因此,本文接下來(lái)的例子主要以一維和二維數(shù)字型數(shù)組來(lái)進(jìn)行示例說(shuō)明。

特定array的創(chuàng)建

在實(shí)際上的項(xiàng)目工程中,我們常常會(huì)需要一些特定的數(shù)據(jù),NumPy中提供了這么一些輔助函數(shù):

  • zeros:用來(lái)創(chuàng)建元素全部是0的數(shù)組
  • ones:用來(lái)創(chuàng)建元素全部是1的數(shù)組
  • empty:用來(lái)創(chuàng)建未初始化的數(shù)據(jù),因此是內(nèi)容是不確定的
  • arange:通過(guò)指定范圍和步長(zhǎng)來(lái)創(chuàng)建數(shù)組
  • linespace:通過(guò)指定范圍和元素?cái)?shù)量來(lái)創(chuàng)建數(shù)組
  • random:用來(lái)生成隨機(jī)數(shù)
# create_specific_array.py

import numpy as np

a = np.zeros((2,3))
print('np.zeros((2,3)= \n{}\n'.format(a))

b = np.ones((2,3))
print('np.ones((2,3))= \n{}\n'.format(b))

c = np.empty((2,3))
print('np.empty((2,3))= \n{}\n'.format(c))

d = np.arange(1, 2, 0.3)
print('np.arange(1, 2, 0.3)= \n{}\n'.format(d))

e = np.linspace(1, 2, 7)
print('np.linspace(1, 2, 7)= \n{}\n'.format(e))

f = np.random.random((2,3))
print('np.random.random((2,3))= \n{}\n'.format(f))

這段代碼的輸出如下

np.zeros((2,3)= 
[[ 0. 0. 0.]
 [ 0. 0. 0.]]
np.ones((2,3))= 
[[ 1. 1. 1.]
 [ 1. 1. 1.]]
np.empty((2,3))= 
[[ 1. 1. 1.]
 [ 1. 1. 1.]]
np.arange(1, 2, 0.3)= 
[ 1. 1.3 1.6 1.9]
np.linspace(1, 2, 7)= 
[ 1.  1.16666667 1.33333333 1.5  1.66666667 1.83333333
 2. ]
np.random.random((2,3))= 
[[ 0.5744616 0.58700653 0.59609648]
 [ 0.0417809 0.23810732 0.38372978]]

Shape與操作

除了生成數(shù)組之外,當(dāng)我們已經(jīng)持有某個(gè)數(shù)據(jù)之后,我們可能會(huì)需要根據(jù)已有數(shù)組來(lái)產(chǎn)生一些新的數(shù)據(jù)結(jié)構(gòu),這時(shí)候我們可以使用下面這些函數(shù):

  • reshape:根據(jù)已有數(shù)組和指定的shape,生成一個(gè)新的數(shù)組
  • vstack:用來(lái)將多個(gè)數(shù)組在垂直(v代表vertical)方向拼接(數(shù)組的維度必須匹配)
  • hstack:用來(lái)將多個(gè)數(shù)組在水平(h代表horizontal)方向拼接(數(shù)組的維度必須匹配)
  • hsplit:用來(lái)將數(shù)組在水平方向拆分
  • vsplit:用來(lái)將數(shù)組在垂直方向拆分

下面我們通過(guò)一些例子來(lái)進(jìn)行說(shuō)明。

為了便于測(cè)試,我們先創(chuàng)建幾個(gè)數(shù)據(jù)。這里我們創(chuàng)建了:

  • zero_line:一行包含3個(gè)0的數(shù)組
  • one_column:一列包含3個(gè)1的數(shù)組
  • a:一個(gè)2行3列的矩陣
  • b:[11, 20)區(qū)間的整數(shù)數(shù)組
# shape_manipulation.py
zero_line = np.zeros((1,3))
one_column = np.ones((3,1))
print("zero_line = \n{}\n".format(zero_line))
print("one_column = \n{}\n".format(one_column))
a = np.array([(1,2,3), (4,5,6)])
b = np.arange(11, 20)
print("a = \n{}\n".format(a))
print("b = \n{}\n".format(b))

通過(guò)輸出我們可以看到它們的結(jié)構(gòu):

zero_line = 
[[ 0. 0. 0.]]
one_column = 
[[ 1.]
 [ 1.]
 [ 1.]]
a = 
[[1 2 3]
 [4 5 6]]
b = 
[11 12 13 14 15 16 17 18 19]

數(shù)組b原先是一個(gè)一維數(shù)組,現(xiàn)在我們通過(guò)reshape方法將其調(diào)整成為一個(gè)3行3列的矩陣:

# shape_manipulation.py
b = b.reshape(3, -1)
print("b.reshape(3, -1) = \n{}\n".format(b))

這里的第二參數(shù)設(shè)為-1,表示根據(jù)實(shí)際情況自動(dòng)決定。由于原先是9個(gè)元素的數(shù)組,因此調(diào)整后剛好是3X3的矩陣。這段代碼輸出如下:

b.reshape(3, -1) = 
[[11 12 13]
 [14 15 16]
 [17 18 19]]

接著,我們通過(guò)vstack函數(shù),將三個(gè)數(shù)組在垂直方向拼接:

# shape_manipulation.py
c = np.vstack((a, b, zero_line))
print("c = np.vstack((a,b, zero_line)) = \n{}\n".format(c))

這段代碼輸出如下,請(qǐng)讀者仔細(xì)觀察一下拼接前后的數(shù)據(jù)結(jié)構(gòu):

c = np.vstack((a,b, zero_line)) = 
[[ 1. 2. 3.]
 [ 4. 5. 6.]
 [ 11. 12. 13.]
 [ 14. 15. 16.]
 [ 17. 18. 19.]
 [ 0. 0. 0.]]

同樣的,我們也可以通過(guò)hstack進(jìn)行水平方向的拼接。為了可以拼接我們需要先將數(shù)組a調(diào)整一下結(jié)構(gòu):

# shape_manipulation.py
a = a.reshape(3, 2)
print("a.reshape(3, 2) = \n{}\n".format(a))
d = np.hstack((a, b, one_column))
print("d = np.hstack((a,b, one_column)) = \n{}\n".format(d))

這段代碼輸出如下,請(qǐng)?jiān)俅巫屑?xì)觀察拼接前后的數(shù)據(jù)結(jié)構(gòu):

a.reshape(3, 2) = 
[[1 2]
 [3 4]
 [5 6]]
d = np.hstack((a,b, one_column)) = 
[[ 1.  2. 11. 12. 13.  1.]
 [ 3.  4. 14. 15. 16.  1.]
 [ 5.  6. 17. 18. 19.  1.]]

請(qǐng)注意,如果兩個(gè)數(shù)組的結(jié)構(gòu)是不兼容的,拼接將無(wú)法完成。例如下面這行代碼,它將無(wú)法執(zhí)行:

# shape_manipulation.py
# np.vstack((a,b)) # ValueError: dimensions not match

這是因?yàn)閿?shù)組a具有兩列,而數(shù)組b具有3列,所以它們無(wú)法拼接。

接下來(lái)我們?cè)倏匆幌虏鸱帧J紫?,我們將?shù)組d在水平方向拆分成3個(gè)數(shù)組。然后我們將中間一個(gè)(下標(biāo)是1)數(shù)組打印出來(lái):

# shape_manipulation.py
e = np.hsplit(d, 3) # Split a into 3
print("e = np.hsplit(d, 3) = \n{}\n".format(e))
print("e[1] = \n{}\n".format(e[1]))

這段代碼輸出如下:

e = np.hsplit(d, 3) = 
[array([[ 1., 2.],
    [ 3., 4.],
    [ 5., 6.]]), array([[ 11., 12.],
    [ 14., 15.],
    [ 17., 18.]]), array([[ 13.,  1.],
    [ 16.,  1.],
    [ 19.,  1.]])]
e[1] = 
[[ 11. 12.]
 [ 14. 15.]
 [ 17. 18.]]

另外,假設(shè)我們?cè)O(shè)置的拆分?jǐn)?shù)量使得原先的數(shù)組無(wú)法平均拆分,則操作會(huì)失?。?/p>

# np.hsplit(d, 4) # ValueError: array split does not result in an equal division

除了指定數(shù)量平均拆分,我們也可以指定列數(shù)進(jìn)行拆分。下面是將數(shù)組d從第1列和第3列兩個(gè)地方進(jìn)行拆分:

# shape_manipulation.py
f = np.hsplit(d, (1, 3)) # # Split a after the 1st and the 3rd column
print("f = np.hsplit(d, (1, 3)) = \n{}\n".format(f))

這段代碼輸出如下。數(shù)組d被拆分成了分別包含1,2,3列的三個(gè)數(shù)組:

f = np.hsplit(d, (1, 3)) = 
[array([[ 1.],
    [ 3.],
    [ 5.]]), array([[ 2., 11.],
    [ 4., 14.],
    [ 6., 17.]]), array([[ 12., 13.,  1.],
    [ 15., 16.,  1.],
    [ 18., 19.,  1.]])]

最后我們?cè)賹?shù)組d在垂直方向進(jìn)行拆分。同樣的,如果指定的拆分?jǐn)?shù)無(wú)法平均拆分則會(huì)失敗:

# shape_manipulation.py
g = np.vsplit(d, 3)
print("np.hsplit(d, 2) = \n{}\n".format(g))
# np.vsplit(d, 2) # ValueError: array split does not result in an equal division
np.vsplit(d, 3)將產(chǎn)生三個(gè)一維數(shù)組:
np.vsplit(d, 3) = 
[array([[ 1.,  2., 11., 12., 13.,  1.]]), array([[ 3.,  4., 14., 15., 16.,  1.]]), array([[ 5.,  6., 17., 18., 19.,  1.]])]

索引

接下來(lái)我們看看如何訪問(wèn)NumPy數(shù)組中的數(shù)據(jù)。

同樣的,為了測(cè)試方便,我們先創(chuàng)建一個(gè)一維數(shù)組。它的內(nèi)容是 [100,200)區(qū)間的整數(shù)。

最基本的,我們可以通過(guò)array[index]的方式指定下標(biāo)來(lái)訪問(wèn)數(shù)組的元素,這一點(diǎn)對(duì)于有一點(diǎn)編程經(jīng)驗(yàn)的人來(lái)說(shuō)應(yīng)該都是很熟悉的。

# array_index.py
import numpy as np
base_data = np.arange(100, 200)
print("base_data\n={}\n".format(base_data))
print("base_data[10] = {}\n".format(base_data[10]))

上面這段代碼輸出如下:

base_data
=[100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
 190 191 192 193 194 195 196 197 198 199]
base_data[10] = 110

在NumPy中,我們可以創(chuàng)建一個(gè)包含了若干個(gè)下標(biāo)的數(shù)組來(lái)獲取目標(biāo)數(shù)組中的元素。如下所示:

# array_index.py
every_five = np.arange(0, 100, 5)
print("base_data[every_five] = \n{}\n".format(
  base_data[every_five]))

every_five是包含了我們要獲取的下標(biāo)的數(shù)組,它的內(nèi)容大家應(yīng)該很容易理解。我們可以直接通過(guò)方括號(hào)的形式來(lái)獲取到所有我們指定了下標(biāo)的元素,它們?nèi)缦拢?/p>

base_data[every_five] = 
[100 105 110 115 120 125 130 135 140 145 150 155 160 165 170 175 180 185
 190 195]

下標(biāo)數(shù)組可以是一維的,當(dāng)然也可以是多維的。假設(shè)我們要獲取一個(gè)2X2的矩陣,這個(gè)矩陣的內(nèi)容來(lái)自于目標(biāo)數(shù)組中1,2,10,20這四個(gè)下標(biāo)的元素,則可以這樣寫(xiě):

# array_index.py
a = np.array([(1,2), (10,20)])
print("a = \n{}\n".format(a))
print("base_data[a] = \n{}\n".format(base_data[a]))

這段代碼輸出如下:

a = 
[[ 1 2]
 [10 20]]
base_data[a] = 
[[101 102]
 [110 120]]

上面我們看到的是目標(biāo)數(shù)組是一維的情況,下面我們把這個(gè)數(shù)組轉(zhuǎn)換成一個(gè)10X10的二維數(shù)組。

# array_index.py
base_data2 = base_data.reshape(10, -1)
print("base_data2 = np.reshape(base_data, (10, -1)) = \n{}\n".format(base_data2))

reshape函數(shù)前面已經(jīng)介紹過(guò),大家應(yīng)該能夠想到它的結(jié)果:

base_data2 = np.reshape(base_data, (10, -1)) = 
[[100 101 102 103 104 105 106 107 108 109]
 [110 111 112 113 114 115 116 117 118 119]
 [120 121 122 123 124 125 126 127 128 129]
 [130 131 132 133 134 135 136 137 138 139]
 [140 141 142 143 144 145 146 147 148 149]
 [150 151 152 153 154 155 156 157 158 159]
 [160 161 162 163 164 165 166 167 168 169]
 [170 171 172 173 174 175 176 177 178 179]
 [180 181 182 183 184 185 186 187 188 189]
 [190 191 192 193 194 195 196 197 198 199]]

對(duì)于二維數(shù)組來(lái)說(shuō):

  • 假設(shè)我們只指定了一個(gè)下標(biāo),則訪問(wèn)的結(jié)果仍然是一個(gè)數(shù)組。
  • 假設(shè)我們指定了兩個(gè)下標(biāo),則訪問(wèn)得到的是其中的元素

我們也可以通過(guò)”-1”來(lái)指定“最后一個(gè)”的元素

# array_index.py
print("base_data2[2] = \n{}\n".format(base_data2[2]))
print("base_data2[2, 3] = \n{}\n".format(base_data2[2, 3]))
print("base_data2[-1, -1] = \n{}\n".format(base_data2[-1, -1]))

這段代碼輸出如下。

對(duì)于更高維的數(shù)組,原理是一樣的,讀者可以自行推理。

base_data2[2] = 
[120 121 122 123 124 125 126 127 128 129]
base_data2[2, 3] = 
123
base_data2[-1, -1] = 
199

除此之外,我們還可以通過(guò)”:“的形式來(lái)指定范圍,例如:2:5 這樣。只寫(xiě)”:“則表示全部范圍。

請(qǐng)看下面這段代碼:

# array_index.py
print("base_data2[2, :]] = \n{}\n".format(base_data2[2, :]))
print("base_data2[:, 3]] = \n{}\n".format(base_data2[:, 3]))
print("base_data2[2:5, 2:4]] = \n{}\n".format(base_data2[2:5, 2:4]))

它的含義是:

  • 獲取下標(biāo)為2的行的所有元素
  • 獲取下標(biāo)為3的列的所有元素

獲取下標(biāo)為[2,5)行,下標(biāo)為[2,4)列的所有元素。請(qǐng)讀者仔細(xì)觀察一下下面的輸出結(jié)果:

base_data2[2, :]] = 
[120 121 122 123 124 125 126 127 128 129]
base_data2[:, 3]] = 
[103 113 123 133 143 153 163 173 183 193]
base_data2[2:5, 2:4]] = 
[[122 123]
 [132 133]
 [142 143]]

數(shù)學(xué)運(yùn)算

NumPy中自然也少不了大量的數(shù)學(xué)運(yùn)算函數(shù),下面是一些例子,更多的函數(shù)請(qǐng)參見(jiàn)這里NumPy manual contents:

# operation.py
import numpy as np
base_data = (np.random.random((5, 5)) - 0.5) * 100
print("base_data = \n{}\n".format(base_data))
print("np.amin(base_data) = {}".format(np.amin(base_data)))
print("np.amax(base_data) = {}".format(np.amax(base_data)))
print("np.average(base_data) = {}".format(np.average(base_data)))
print("np.sum(base_data) = {}".format(np.sum(base_data)))
print("np.sin(base_data) = \n{}".format(np.sin(base_data)))

這段代碼輸出如下:

base_data = 
[[ -9.63895991 6.9292461 -2.35654712 -48.45969283 13.56031937]
 [-39.75875796 -43.21031705 -49.27708561 6.80357128 33.71975059]
 [ 36.32228175 30.92546582 -41.63728955 28.68799187 6.44818484]
 [ 7.71568596 43.24884701 -14.90716555 -9.24092252 3.69738718]
 [-31.90994273 34.06067289 18.47830413 -16.02495202 -44.84625246]]

np.amin(base_data) = -49.277085606595726
np.amax(base_data) = 43.24884701268845
np.average(base_data) = -3.22680706079886
np.sum(base_data) = -80.6701765199715
np.sin(base_data) = 
[[ 0.21254814 0.60204578 -0.70685739 0.9725159 0.8381861 ]
 [-0.88287359 0.69755541 0.83514527 0.49721505 0.74315189]
 [-0.98124746 -0.47103234 0.7149727 -0.40196147 0.16425187]
 [ 0.99045239 -0.66943662 -0.71791164 -0.18282139 -0.5276184 ]
 [-0.4741657 0.47665553 -0.36278223 0.31170676 -0.76041722]]

矩陣

接下來(lái)我們看一下以矩陣的方式使用NumPy。

首先,我們創(chuàng)建一個(gè)5X5的隨機(jī)數(shù)整數(shù)矩陣。有兩種方式可以獲得矩陣的轉(zhuǎn)置:通過(guò).T或者transpose函數(shù)。另外, 通過(guò)dot函數(shù)可以進(jìn)行矩陣的乘法,示例代碼如下:

# matrix.py

import numpy as np

base_data = np.floor((np.random.random((5, 5)) - 0.5) * 100)
print("base_data = \n{}\n".format(base_data))

print("base_data.T = \n{}\n".format(base_data.T))
print("base_data.transpose() = \n{}\n".format(base_data.transpose()))

matrix_one = np.ones((5, 5))
print("matrix_one = \n{}\n".format(matrix_one))

minus_one = np.dot(matrix_one, -1)
print("minus_one = \n{}\n".format(minus_one))

print("np.dot(base_data, minus_one) = \n{}\n".format(
 np.dot(base_data, minus_one)))
這段代碼輸出如下:

base_data = 
[[-49. -5. 11. -13. -41.]
 [ -6. -33. -33. -47. -4.]
 [-38. 26. 28. -18. 18.]
 [ -3. -19. -15. -39. 45.]
 [-43. 6. 18. -15. -21.]]

base_data.T = 
[[-49. -6. -38. -3. -43.]
 [ -5. -33. 26. -19. 6.]
 [ 11. -33. 28. -15. 18.]
 [-13. -47. -18. -39. -15.]
 [-41. -4. 18. 45. -21.]]

base_data.transpose() = 
[[-49. -6. -38. -3. -43.]
 [ -5. -33. 26. -19. 6.]
 [ 11. -33. 28. -15. 18.]
 [-13. -47. -18. -39. -15.]
 [-41. -4. 18. 45. -21.]]

matrix_one = 
[[ 1. 1. 1. 1. 1.]
 [ 1. 1. 1. 1. 1.]
 [ 1. 1. 1. 1. 1.]
 [ 1. 1. 1. 1. 1.]
 [ 1. 1. 1. 1. 1.]]

minus_one = 
[[-1. -1. -1. -1. -1.]
 [-1. -1. -1. -1. -1.]
 [-1. -1. -1. -1. -1.]
 [-1. -1. -1. -1. -1.]
 [-1. -1. -1. -1. -1.]]

np.dot(base_data, minus_one) = 
[[ 97. 97. 97. 97. 97.]
 [ 123. 123. 123. 123. 123.]
 [ -16. -16. -16. -16. -16.]
 [ 31. 31. 31. 31. 31.]
 [ 55. 55. 55. 55. 55.]]


隨機(jī)數(shù)

本文的最后,我們來(lái)看一下隨機(jī)數(shù)的使用。

隨機(jī)數(shù)是我們?cè)诰幊踢^(guò)程中非常頻繁用到的一個(gè)功能。例如:生成演示數(shù)據(jù),或者將已有的數(shù)據(jù)順序隨機(jī)打亂以便分割出建模數(shù)據(jù)和驗(yàn)證數(shù)據(jù)。

numpy.random 包中包含了很多中隨機(jī)數(shù)的算法。下面我們列舉四種最常見(jiàn)的用法:

# rand.py
import numpy as np
print("random: {}\n".format(np.random.random(20)));
print("rand: {}\n".format(np.random.rand(3, 4)));
print("randint: {}\n".format(np.random.randint(0, 100, 20)));
print("permutation: {}\n".format(np.random.permutation(np.arange(20))));

在四種用法分別是:

  1. 生成20個(gè)隨機(jī)數(shù),它們每一個(gè)都是[0.0, 1.0)之間
  2. 根據(jù)指定的shape生成隨機(jī)數(shù)
  3. 生成指定范圍內(nèi)([0, 100))的指定數(shù)量(20)的隨機(jī)整數(shù)
  4. 對(duì)已有的數(shù)據(jù)([0, 1, 2, ..., 19])的順序隨機(jī)打亂順序

這段代碼的輸出如下所示:

random: [0.62956026 0.56816277 0.30903156 0.50427765 0.92117724 0.43044905
 0.54591323 0.47286235 0.93241333 0.32636472 0.14692983 0.02163887
 0.85014782 0.20164791 0.76556972 0.15137427 0.14626625 0.60972522
 0.2995841 0.27569573]
rand: [[0.38629927 0.43779617 0.96276889 0.80018417]
 [0.67656892 0.97189483 0.13323458 0.90663724]
 [0.99440473 0.85197677 0.9420241 0.79598706]]
randint: [74 65 51 34 22 69 81 36 73 35 98 26 41 84 0 93 41 6 51 55]
permutation: [15 3 8 18 14 19 16 1 0 4 10 17 5 2 6 12 9 11 13 7]

總結(jié)

以上所述是小編給大家介紹的Python 機(jī)器學(xué)習(xí)庫(kù) NumPy入門(mén)教程,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • python飛機(jī)大戰(zhàn)pygame游戲之?dāng)硻C(jī)出場(chǎng)實(shí)現(xiàn)方法詳解

    python飛機(jī)大戰(zhàn)pygame游戲之?dāng)硻C(jī)出場(chǎng)實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了python飛機(jī)大戰(zhàn)pygame游戲之?dāng)硻C(jī)出場(chǎng)實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Python使用pygame模塊實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲中敵機(jī)出場(chǎng)相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-12-12
  • python神經(jīng)網(wǎng)絡(luò)InceptionV3模型復(fù)現(xiàn)詳解

    python神經(jīng)網(wǎng)絡(luò)InceptionV3模型復(fù)現(xiàn)詳解

    這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)InceptionV3模型復(fù)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2022-05-05
  • 解決Pymongo insert時(shí)會(huì)自動(dòng)添加_id的問(wèn)題

    解決Pymongo insert時(shí)會(huì)自動(dòng)添加_id的問(wèn)題

    這篇文章主要介紹了解決Pymongo insert時(shí)會(huì)自動(dòng)添加_id的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Python中optparse模塊使用淺析

    Python中optparse模塊使用淺析

    這篇文章主要介紹了Python中optparse模塊使用淺析,optparse模塊主要用來(lái)為腳本傳遞命令參數(shù)功能,需要的朋友可以參考下
    2015-01-01
  • 自定義Django默認(rèn)的sitemap站點(diǎn)地圖樣式

    自定義Django默認(rèn)的sitemap站點(diǎn)地圖樣式

    這篇文章主要介紹了自定義Django默認(rèn)的sitemap站點(diǎn)地圖樣式,通過(guò)代碼給大家介紹了使用Django的sitemap功能,代碼很簡(jiǎn)單非常不錯(cuò)對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Python中的特殊語(yǔ)法:filter、map、reduce、lambda介紹

    Python中的特殊語(yǔ)法:filter、map、reduce、lambda介紹

    這篇文章主要介紹了Python中的特殊語(yǔ)法:filter、map、reduce、lambda介紹,本文分別對(duì)這個(gè)特殊語(yǔ)法給出了代碼實(shí)例,需要的朋友可以參考下
    2015-04-04
  • python多線程semaphore實(shí)現(xiàn)線程數(shù)控制的示例

    python多線程semaphore實(shí)現(xiàn)線程數(shù)控制的示例

    這篇文章主要介紹了python多線程semaphore實(shí)現(xiàn)線程數(shù)控制的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Python 找出英文單詞列表(list)中最長(zhǎng)單詞鏈

    Python 找出英文單詞列表(list)中最長(zhǎng)單詞鏈

    這篇文章主要介紹了Python 找出英文單詞列表(list)中最長(zhǎng)單詞鏈,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Python+matplotlib實(shí)現(xiàn)餅圖的繪制

    Python+matplotlib實(shí)現(xiàn)餅圖的繪制

    Matplotlib是一個(gè)Python的2D繪圖庫(kù),它以各種硬拷貝格式和跨平臺(tái)的交互式環(huán)境生成出版質(zhì)量級(jí)別的圖形。本文將利用Matplotlib庫(kù)繪制餅圖,感興趣的可以了解一下
    2022-03-03
  • python使用flask與js進(jìn)行前后臺(tái)交互的例子

    python使用flask與js進(jìn)行前后臺(tái)交互的例子

    今天小編就為大家分享一篇python使用flask與js進(jìn)行前后臺(tái)交互的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07

最新評(píng)論

修文县| 城口县| 彰化县| 维西| 右玉县| 酒泉市| 建水县| 仲巴县| 博客| 德昌县| 凉城县| 维西| 庆元县| 开封县| 沛县| 东辽县| 太白县| 荣成市| 垣曲县| 福海县| 双辽市| 和龙市| 古蔺县| 兴城市| 仙游县| 黄梅县| 乐山市| 洱源县| 西贡区| 洛隆县| 金塔县| 吉安市| 云霄县| 全南县| 清新县| 达孜县| 兴安盟| 衡阳市| 潮安县| 维西| 连城县|