Python之Numpy初識

dicksonjyl560101發表於2018-01-06

PythonNumpy初識

 

http://mp.weixin.qq.com/s/Z4-bXq61XPIL2J87Twipiw

 

今天翻了下計劃,要學習Numpy了,所以得調動腦細胞的積極性,看看能有什麼收穫。

首先得了解下什麼是Numpy,從我的印象中,一般提到這個工具都會和機器學習關聯起來了。當然和實際的理解又很多的差距。

簡單來說,Python本身不是設計為科學計算的語言,但是Python隨著使用的普及和大量的擴充套件,這方面的需求會越來越大,於是有了Numpy來作為補充。

下載Numpy可以使用pip,一個命令即可搞定pip install numpy,大概10M

Numpy相比TensorFlow的環境搭建要容易多了,校驗的方式也很簡單,import即可。

>>> import numpy

如果要檢視版本可以使用如下的方式。

>>> numpy.version.full_version

'1.13.3'

>>> 

當然我們可以指定別名,使用起來更簡便一些,我們後續的測試都是這麼玩。

>>> import numpy as np

>>> np.version.full_version

'1.13.3'

我們先來熱熱身。

得到一個範圍10以內的整數串,確切的說是陣列。

>>> a = np.arange(10)

>>> print a

[0 1 2 3 4 5 6 7 8 9]

列印出來看是陣列了

>>> type(a)

<type 'numpy.ndarray'>

然後我們變個花樣,把這個陣列改造成一個2部分,每一部分是5個。

>>> a = a.reshape(2,5)

>>> print a

[[0 1 2 3 4]

 [5 6 7 8 9]]

可以繼續重構,重構成20個元素,然後分成4部分,每個部分就是5個元素

>>> a = np.arange(20)

>>> a = a.reshape(4,5)

>>> print a

[[ 0  1  2  3  4]

 [ 5  6  7  8  9]

 [10 11 12 13 14]

 [15 16 17 18 19]]

還可以構造高維的陣列,比如下面這樣。

>>> a = a.reshape(2,2,5)

>>> print a

[[[ 0  1  2  3  4]

  [ 5  6  7  8  9]]

 

 [[10 11 12 13 14]

  [15 16 17 18 19]]]

>>> 

如果輸入(2,2,6)就不可以了,明顯的2*2*6=24,已經溢位了。

>>> a = a.reshape(2,2,6)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

ValueError: cannot reshape array of size 20 into shape (2,2,6)

>>> 

我們得到陣列的維度

>>> a.ndim

3

得到陣列各維度的大小

>>> a.shape

(2L, 2L, 5L)

檢視陣列的元素個數

>>> a.size

20

 

然後我們建立陣列,可以轉換列表來得到,

>>> raw = [0,1,2,3,4]

>>> a = np.array(raw)

>>> a

array([0, 1, 2, 3, 4])

>>> print a

[0 1 2 3 4]

換個略微複雜的,也是一樣的操作。

>>> raw = [[0,1,2,3,4],[5,6,7,8,9]]

>>> b = np.array(raw

>>> b

array([[0, 1, 2, 3, 4],

       [5, 6, 7, 8, 9]])

>>> 

如果要得到顯示為0的陣列,可以使用這種方式zeros

>>> d = (4,5)

>>> np.zeros(d)

array([[ 0.,  0.,  0.,  0.,  0.],

       [ 0.,  0.,  0.,  0.,  0.],

       [ 0.,  0.,  0.,  0.,  0.],

       [ 0.,  0.,  0.,  0.,  0.]])

當然效果不理想都顯示了小數點,可以格式化,改成整型

>>> np.ones(d,dtype=int)

array([[1, 1, 1, 1, 1],

       [1, 1, 1, 1, 1],

       [1, 1, 1, 1, 1],

       [1, 1, 1, 1, 1]])

得到隨機數,一口氣生成5個。

>>> np.random.rand(5)

array([ 0.61643689,  0.15915655,  0.20558268,  0.75157157,  0.50395262])

按照這個思路,隨機生成100個也是秒級。

 

再來看看陣列運算

這個部分就逐漸顯示出優勢了,可以支援計算。

>>> a = np.array([[1,2],[2,5]])

>>> print a

[[1 2]

 [2 5]]

>>> b = np.array([[2,3],[5,8]])

>>> print a+b

[[ 3  5]

 [ 7 13]]

 

得到一些最大值,最小值。

>>> a = np.arange(20).reshape(4,5)

>>> print a

[[ 0  1  2  3  4]

 [ 5  6  7  8  9]

 [10 11 12 13 14]

 [15 16 17 18 19]]

>>> print str(a.sum())

190

>>> print str(a.max())

19

>>> print str(a.min())

0

 

>>> print str(a.max(axis=1))

[ 4  9 14 19]

>>> 

 

可以很容易的變換。

>>> b = np.arange(2,45,3).reshape(5,3)

>>> b = np.mat(b)

>>> print b

[[ 2  5  8]

 [11 14 17]

 [20 23 26]

 [29 32 35]

 [38 41 44]]

 

如果最大的數是2,從0開始,取5個數是這樣的寫法

 >>> np.linspace(0,2,5)

array([ 0. ,  0.5,  1. ,  1.5,  2. ])

如果是9個數,則是如下的方式。

>>> np.linspace(0,2,9)

array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ])

>>> 

 

>>> a = np.array([[3,2],[5,9]])

>>> print a[0][1]

2

>>> print a[1][0]

5

>>> print a[1,0]

5

>>> b = a

>>> a[0][1]=100

>>> print a

[[  3 100]

 [  5   9]]

>>> print b

[[  3 100]

 [  5   9]]

 

 上面的結果看起來有些奇怪,其實問題的原因是:Python不是真正將a複製一份給b,而是將b指到了a對應資料的記憶體地址上。

可以使用copy來規避。

 >>> a = np.array([[3,2],[5,9]])

>>> b = a.copy()

>>> a[0][1] = 100

>>> print a

[[  3 100]

 [  5   9]]

>>> print b

[[3 2]

 [5 9]]

 

 

指定列

>>> a = np.arange(20).reshape(4,5)

>>> print a

[[ 0  1  2  3  4]

 [ 5  6  7  8  9]

 [10 11 12 13 14]

 [15 16 17 18 19]]

>>> print a[:,[1,3]]

[[ 1  3]

 [ 6  8]

 [11 13]

 [16 18]]

 

 

按列拼接兩個向量成一個矩陣:

>>> a = np.array((1,2,3))

>>> b = np.array((2,3,4))

>>> print np.column_stack((a,b))

[[1 2]

 [2 3]

 [3 4]]

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29829936/viewspace-2149799/,如需轉載,請註明出處,否則將追究法律責任。

相關文章