1. 程式人生 > >Python學習筆記-資料分析-Numpy01

Python學習筆記-資料分析-Numpy01

Numpy是Python開源的科學計算工具包,主要的特點如下:

  • 強大的N維陣列物件:ndarray
  • 對陣列結構資料進行運算(不用遍歷迴圈)
  • 隨機數、線性代數、傅立葉變換等多種功能
說明:
1、本人的筆記均在win10(64)環境下的Jupyter- Notebook中直接編寫,如有需要可以直接拷貝程式碼。
2、註釋中除了有關於程式碼的解釋,還有本人在學習中的一些拙見。
3、本人程式碼註釋均寫在程式碼上方。

一、 Numpy陣列ndarray

# 注意與list打印出來的區別,list用逗號分隔元素。array沒有分隔。

# 引入numpy這個包,並改名為np
import numpy as np

# 用.array建立np的陣列,型別是numpy.ndarray
# .array()是個方法,所以後面的小括號是必須的。
# 小括號裡是要生成的陣列的內容,可以用小括號()也可以用中括號[]
ar = np.array((1,2,3,4,5))
ar1 = np.array([1,2,3,4,5])
print(ar, type(ar))
print(ar1,type(ar1))

執行結果如下:

[1 2 3 4 5] <class 'numpy.ndarray'>
[1 2 3 4 5] <class 'numpy.ndarray'>
# 二三維陣列
# 二維陣列是由兩個一維陣列組成的。
# 三維陣列是由兩個二維陣列組成的。
# 剛開始可能對各種括號有些亂,我是這樣區分的。
# 以[[1,2,3,4,5,],[6,7,8,9,10]]為例子:
# 最外層[]跟一維陣列的理解一樣;內層[1,2,3,4,5,]是第一個一維陣列;內層[6,7,8,9,10]是第二個一維陣列
# 中間的,號是區分這兩個陣列
ar2 = np.array([[1,2,3,4,5,],[6,7,8,9,10]])
ar3 = np.array(([1,2,3,4,5],[6,7,8,9,10]))
print(ar2)
print('----------------------------')
print(ar3)
print('----------------------------')

執行結果如下:

[[ 1  2  3  4  5]
 [ 6  7  8  9 10]]
----------------------------
[[ 1  2  3  4  5]
 [ 6  7  8  9 10]]
----------------------------
# 三維陣列
# 注意,由於元素中有字元,所以整個陣列的元素都會變成字元。
ar4 = np.array([[(['a','b','c','d','e'],[1,2,3,4,5])],[(['a','b','c','d','e'],[6,7,8,9,10])]])
print(ar4,type(ar4))在這裡插入程式碼片

執行結果如下:

[[[['a' 'b' 'c' 'd' 'e']
   ['1' '2' '3' '4' '5']]]

 [[['a' 'b' 'c' 'd' 'e']
   ['6' '7' '8' '9' '10']]]] <class 'numpy.ndarray'>

二、陣列生成

1、range()和arange()

# 對於array生成陣列的說明,.array()括號裡可以是列表、元祖、陣列、生成器等等
# 通過range()生成一個0-9的list,並通過array轉換成陣列。
ar_r = np.array(range(10))
print(ar_r,type(ar_r))
# 通過Numpy自己的arange直接生成陣列。
ar_ar = np.arange(10)
print(ar_ar,type(ar_ar))

# 如果arange()括號裡面的數帶小數點的話,例如5.0就變成浮點型了。
ar_r1 = np.arange(5.0)
print(ar_r1,type(ar_r1))
# 跟range()一樣,可以通過最後一個引數來控制步長。
print(np.arange(0,10,2))

執行結果如下:

[0 1 2 3 4 5 6 7 8 9] <class 'numpy.ndarray'>
[0 1 2 3 4 5 6 7 8 9] <class 'numpy.ndarray'>
[0. 1. 2. 3. 4.] <class 'numpy.ndarray'>
[0 2 4 6 8]
# 通過列表直接生成陣列時,前後兩個列表如果元素個數不同的話,會導致的整個陣列維度變化。
ar5 = np.array([[1,2,3,4,5,],[6,7,8,9,10,'a','b']])
ar5_1 = np.array([[1,2,3,4,5,],[6,7,8,9,10,]])
print('這是ar5:',ar5)
print('----------------------------')
print('這是ar5_1:',ar5_1)
print('----------------------------')
print('注意陣列維度--->',ar5.ndim)
print('注意陣列維度--->',ar5_1.ndim)

執行結果如下:

這是ar5: [list([1, 2, 3, 4, 5]) list([6, 7, 8, 9, 10, 'a', 'b'])]
----------------------------
這是ar5_1: [[ 1  2  3  4  5]
 [ 6  7  8  9 10]]
----------------------------
注意陣列維度---> 1
注意陣列維度---> 2

2、.linspace()

# .linspace()有五個常用引數(開始,結束,個數,是否包含最後一個數,顯示步長),如果最後一個引數不指定就包括“開始”和“結束”這兩個值。
# 注意
# 1、由於包括開始和結束,所以在進行間隔分段的時候經常出現帶小數的,而且小數的位數很多。
# 2、想避開很多小數位的話,可以調整分隔數
# 3、如果步長引數retstep = True的話,那麼生成的就是元祖了。

# 從1開始到15,共分12份
print(np.linspace(1,15,num = 12))
print('-----------------------------')

# 從1開始到15,共分11份
print(np.linspace(1,15,num = 11))
print('-----------------------------')

# 從1開始到15,共分10份,但不包含最後一個數15 retstep
print(np.linspace(1,15,num = 10,endpoint = False))
print('-----------------------------')

#從1開始到15,共分10份,顯示步長
s = np.linspace(1,15,num = 10,retstep = True)
print(s)
print('注意是元祖--->',type(s))
print('-----------------------------')

# 通過下標訪問的話,第一個是陣列本身,第二個是步長
print('陣列-->',s[0])
print('-----------------------------')
print('步長-->',s[1])

執行結果如下:

[ 1.          2.27272727  3.54545455  4.81818182  6.09090909  7.36363636
  8.63636364  9.90909091 11.18181818 12.45454545 13.72727273 15.        ]
-----------------------------
[ 1.   2.4  3.8  5.2  6.6  8.   9.4 10.8 12.2 13.6 15. ]
-----------------------------
[ 1.   2.4  3.8  5.2  6.6  8.   9.4 10.8 12.2 13.6]
-----------------------------
(array([ 1.        ,  2.55555556,  4.11111111,  5.66666667,  7.22222222,
        8.77777778, 10.33333333, 11.88888889, 13.44444444, 15.        ]), 1.5555555555555556)
注意是元祖---> <class 'tuple'>
-----------------------------
陣列--> [ 1.          2.55555556  4.11111111  5.66666667  7.22222222  8.77777778
 10.33333333 11.88888889 13.44444444 15.        ]
-----------------------------
步長--> 1.5555555555555556

3、zeros()和ones()

# .zeros()生成元素全部為0的陣列,zeros(shape, dtype=float, order='C')
# .ones()生成元素全部為1的陣列,ones(shape, dtype=None, order='C')

# 生成10個元素為0的陣列
print('10個元素為0的陣列:','\n',np.zeros(10))
# 生成10個元素為1的陣列
print('10個元素為1的陣列:','\n',np.ones(10))

# 生成2行5列的二維全0陣列
# 注意括號裡的寫發,引數第一個是shape也就是形狀,
print('2行5列二維陣列--->','\n',np.zeros((2,5)))
print('3行5列二維陣列--->','\n',np.zeros((3,5)))

s1 = np.zeros((2,3,5))
print('三維陣列--->','\n',s1)
print('幾維陣列??-->',s1.ndim)
# ones()同樣是
print('2行5列二維陣列--->','\n',np.ones((2,5)))
print('3行5列二維陣列--->','\n',np.ones((3,5)))
s2 = np.ones((2,3,5))
print('三維陣列--->','\n',s2)
print('幾維陣列??-->',s2.ndim)

執行結果如下:

10個元素為0的陣列: 
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
10個元素為1的陣列: 
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
2行5列二維陣列---> 
 [[0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]
3行5列二維陣列---> 
 [[0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]
三維陣列---> 
 [[[0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]]

 [[0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]]]
幾維陣列??--> 3
2行5列二維陣列---> 
 [[1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]]
3行5列二維陣列---> 
 [[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.]
  [1. 1. 1. 1. 1.]]

 [[1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]]]
幾維陣列??--> 3

4、zeros_like()、/ones_like()和eye()

# .zeros_like()生成一個和引數形狀相同的全0陣列。
# .ones_like()生成一個和引數形狀相同的全1陣列。
print('前面定義的一個二維陣列:','\n',ar2)
print('生成一個和ar2形狀相同的全0陣列:','\n',np.zeros_like(ar2))
print('生成一個和ar2形狀相同的全1陣列:','\n',np.ones_like(ar2))


# eye()生成一個正方的N×N的矩陣陣列,其中對角線值為1,其他的為0
print('生成一個4×4的矩陣:','\n',np.eye(4))

執行結果如下:

前面定義的一個二維陣列: 
 [[ 1  2  3  4  5]
 [ 6  7  8  9 10]]
生成一個和ar2形狀相同的全0陣列: 
 [[0 0 0 0 0]
 [0 0 0 0 0]]
生成一個和ar2形狀相同的全1陣列: 
 [[1 1 1 1 1]
 [1 1 1 1 1]]
生成一個4×4的矩陣: 
 [[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]

5、ndim()和shape()

# ndarray.ndim 檢視陣列的維度,也就是看是幾維陣列
# 檢視之前定義的ar、ar2和ar4是幾維陣列
print('ar的維度',ar.ndim)
print('ar2的維度',ar2.ndim)
print('ar4的維度',ar4.ndim)

# ndarray.shape 檢視陣列的形狀或者說是尺寸,就是幾行幾列 如n行m列(n,m)

# ar是0行列5列

print(ar.shape)
print('-----------------------------')
# ar2是2行5列
print(ar2.shape)
print('-----------------------------')

# 看一個特別的例子
ar6 = np.array([[1],[2]])
print(ar6,'\n',ar6.shape)

執行結果如下:

ar的維度 1
ar2的維度 2
ar4的維度 4
(5,)
-----------------------------
(2, 5)
-----------------------------
[[1]
 [2]] 
 (2, 1)

6、size()、dtype()、itemsize()和data()

# ndarray.size 檢視陣列中元素的總個數
print(ar.size)
print('-----------------------------')
print(ar2.size)
print('-----------------------------')
print(ar4.size)
print('-----------------------------')

執行結果如下:

5
-----------------------------
10
-----------------------------
20
-----------------------------
# ndarray.dtype 檢視陣列中元素的型別。
# 另外NumPy提供它自己的型別。numpy.int32,numpy.int16和numpy.float64是一些例子。
# 注意與.type的區別

print(type(ar2),'\n',ar2.dtype)

執行結果如下:

<class 'numpy.ndarray'> 
 int32
# ndarray.itemsize 檢視陣列中每個元素的位元組大小
print(ar2.itemsize)

執行結果如下:

4
# ndarray.data 檢視陣列中元素的緩衝區。
# 一般很少會用到這個,用的比較多的是用索引來範圍各個元素。
print(ar3.data)

執行結果如下:

<memory at 0x000002782F10F1F8>