天天看點

資料分析---科學計算工具numpy(上)

文章目錄

    • 科學計算工具numpy(上)
      • 一、什麼是numpy?
      • 二、numpy基礎資料結構
          • 1.numpy數組---ndarray的基本操作(屬性)
          • 2.建立numpy數組---ndarray
            • (1)清單,元組,數組,生成器等做np下的array()函數的參數建立數組
            • (2)用np下的linspace()函數
            • (3)用np下的zeros()、zeros_like()、ones()、ones_like() 函數
            • (4)用np下的eye()函數
            • (5)np下的reshape()函數
      • 三、numpy通用函數與方法
          • 1.數組的形狀:T 、reshape()、resize()
            • (1)T 、reshape()、resize()
            • (2)reshape()與resize() 的差別
          • 2.ndarray的複制
          • 3.改變numpy的元素類型
            • (1)在生成np時,可以通過設定dtype屬性來設定元素的類型
            • (2)改變已經生成的numpy元素類型
          • 3.ndarray堆疊
          • 3.ndarray的拆分
          • 3.ndarray的簡單運算
      • 小結

科學計算工具numpy(上)

一、什麼是numpy?

Numpy是python開源的科學計算工具包,它含有以下功能:

  • 強大的N維數組對象:ndarray
  • 對數組結構進行運算(不用周遊循環)
  • 随機數、線性代數、傅裡葉變換等功能

二、numpy基礎資料結構

1.numpy數組—ndarray的基本操作(屬性)

numpy數組是一個多元數組對象,稱為ndarray,其由兩部分構成:

  • 實際的資料
  • 描述這些資料的中繼資料

eg:

import numpy as np

lst =[[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]
ar = np.array(lst)
print(lst)
print(ar, type(ar))    # ar是n維數組類型
print(ar.ndim)     # ndim傳回numpy的軸數
print(ar.shape)    # shape傳回numpy的緯度,軸數與列數,且是一個元組,(3,4)
print(ar.size)     # 傳回元素個數
print(ar.dtype)    # ndarray中元素的類型
print(ar.itemsize) # ndarray中一個元素所占的位元組數
print(ar.data)     # ndarray對象ar的實體位址

# 結果:
[[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]
[[1 2 3 4]
 [2 3 4 5]
 [3 4 5 6]] <class 'numpy.ndarray'>
2
(3, 4)
12
int32
4
<memory at 0x000001FFFB43CA68>
           
2.建立numpy數組—ndarray

(1)清單,元組,數組,生成器等做np下的array()函數的參數建立數組

eg:

# 建立數組,array()函數的括号中可以是清單,元組,數組,生成器等
ar1 = np.array(range(10))  # range是一個生成器
ar2 = np.arange(10) # 等價于上一行代碼, arange和range的用法一模一樣,隻是這是調用的np的方法
print(ar1)
print(ar2)

# 如果元素類型不同,會自動将類型轉為大的
ar3 = np.array([[1, 2, 3, 4], ['a', 'b', 'c', 'd']])
print(ar3)

# 如果每個軸中的元素不等,則無論之前輸入的是多少維,都會自動的變為一維數組
ar4 = np.array([[1, 2, 3, 4, 5], ['a', 'b', 'c', 'd']])
print(ar4, ar4.ndim)

# 結果:
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
[['1' '2' '3' '4']
 ['a' 'b' 'c' 'd']]
[list([1, 2, 3, 4, 5]) list(['a', 'b', 'c', 'd'])] 1
           

(2)用np下的linspace()函數

print(np.linspace(10, 20, num=6))  # []左閉右閉,num是表示顯示幾個數,如果是n等分,則num = n + 1
print(np.linspace(10, 20, num=6, endpoint=False)) # endpoint是否包含最後一個點
print(np.linspace(10, 20, num=6, retstep=True))   # retstep為True會傳回一個二進制元組,第二個參數是步長

# 結果:
[10. 12. 14. 16. 18. 20.]
[10.         11.66666667 13.33333333 15.         16.66666667 18.33333333]
(array([10., 12., 14., 16., 18., 20.]), 2.0)
           

(3)用np下的zeros()、zeros_like()、ones()、ones_like() 函數

# zeros()  zeros_like()  元素全是0 ones()   ones_like() 元素全是1
print(np.zeros(10))
print(np.zeros((3, 5)))   # 注意:這裡參數是元組
print(np.zeros((3, 5), dtype=np.int))

ar1 = np.array([list(range(10)), list(range(10, 20))])
print(np.zeros_like(ar1))
ar2 = np.array(['a', 'b'])
print(np.zeros_like(ar2))
# ones和zeros的用法一模一樣
ar2 = np.array(['a', 'b'])
print(np.ones_like(ar2))

# 結果:
[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 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]]
['' '']
['1' '1']
           

(4)用np下的eye()函數

# 用eye()方法,預設生成的是對角線為1的n×n矩陣
print(np.eye(5))

# 結果:
[[1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]
           

(5)np下的reshape()函數

# 以後常用的生成ndarray的方法
print(np.random.rand(10).reshape(2, 5))
# 結果:
[[0.39366876 0.16007069 0.9278696  0.06349453 0.13076   ]
 [0.9044376  0.70655228 0.34562442 0.34571877 0.60094136]]
 
# 當然,一個已經存在了的np,也可以用reshape來改變形狀
ar = np.arange(10)
b = ar.reshape(2, 5)
print(b)
# 結果
[[0 1 2 3 4]
 [5 6 7 8 9]]
           

三、numpy通用函數與方法

1.數組的形狀:T 、reshape()、resize()

(1)T 、reshape()、resize()

eg:T

ar = np.array([list(range(5)), list(range(5,10))])
print(ar.T)      # 注意:這裡是ar.T  不是ar.T()

#結果:
[[0 5]
 [1 6]
 [2 7]
 [3 8]
 [4 9]]
           

eg:reshape()

ar = np.array([list(range(5)), list(range(5,10))])
print(np.reshape(ar, (5, 2))) # 用np下的reshape()函數
print(ar.reshape(5, 2))     # 用ndarray下的reshape()方法

#結果:
[[0 1]
 [2 3]
 [4 5]
 [6 7]
 [8 9]]
[[0 1]
 [2 3]
 [4 5]
 [6 7]
 [8 9]]
[[0 1 2 3 4]
 [5 6 7 8 9]]
           

eg:resize()

print(np.resize(ar, (5, 2)))      # 用np下的resize()函數
print(ar.resize(5, 2))        # 用array下的resize()方法,發現是不行的,隻能用np下的方法

#結果:
[[0 1]
 [2 3]
 [4 5]
 [6 7]
 [8 9]]
None
           

(2)reshape()與resize() 的差別

注意:reshape()與resize()的不同之處在于,對于reshape()之前與之後的元素個數必須相同,而resize()不足的随機補充,過長就截斷

eg:

import numpy as np
ar = np.arange(4)
b = np.resize(ar, (3, 4))
print(b)
# 結果:
[[0 1 2 3]
 [0 1 2 3]
 [0 1 2 3]]
           
2.ndarray的複制

eg:

import numpy as np
ar = np.array([list(range(5)), list(range(5,10))])
ar2 = ar.copy()    # 屬于深複制
print(ar2)

#結果:
[[0 1 2 3 4]
 [5 6 7 8 9]]
           
3.改變numpy的元素類型

(1)在生成np時,可以通過設定dtype屬性來設定元素的類型

eg:
ar = np.array([1, 2, 3.0], dtype=int)
print(ar)
# 結果
[1 2 3]
           

(2)改變已經生成的numpy元素類型

注意:numpy中的資料類型轉換,不能直接改原資料的dtype!隻能用函數astype()。

eg:dtype與astype()

ar = np.arange(3)
print(ar, ar.shape)
b = ar.astype('float32')
print(b, b.shape)
ar.dtype = 'float32'
print(ar, ar.shape)

# 結果:
[0 1 2] (3,)
[0. 1. 2.] (3,)
[0.e+00 1.e-45 3.e-45] (3,)
           

結論:resize()隻能用np.resize()

3.ndarray堆疊

注意:hstack()是橫向堆疊, vstack是豎直堆疊

eg:

ar = np.array([[1], [2], [3]])   # 3*1
ar2 = np.array([['a'], ['b'], ['c']])  # 3*1
print(np.hstack((ar, ar2))) # 橫向連接配接   3*2
print(np.vstack((ar, ar2))) # 豎向疊加    6*1
#  結果:
[['1' 'a']
 ['2' 'b']
 ['3' 'c']]
[['1']
 ['2']
 ['3']
 ['a']
 ['b']
 ['c']]
           
3.ndarray的拆分

注意:hsplit()是橫向拆分, vsplit()是豎直拆分

eg:

ar = np.arange(16).reshape(4, 4)
print(ar)
print(np.hsplit(ar, 2)[0])   # 數值2代表的是要分成幾列,0是代表取第1列資料

# 結果:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
[[ 0  1]
 [ 4  5]
 [ 8  9]
 [12 13]]
           
3.ndarray的簡單運算

eg:

ar = np.arange(8).reshape(2, 4)
print(ar + 10)  # 加法
print(ar - 1)   # 減法
print(ar * 10)  # 乘法
print(ar / 2)   # 除法

print(ar.mean())  # 求平均數
print(ar.max())   # 求最大值
print(ar.min())   # 求最小值
print(ar.std())   # 求标準差
print(ar.var())   # 求方差
print(np.sort(ar))   # 排序
print(ar.sum())   # 求和
print(np.sum(ar, axis=1))   # 求方和,axis=1是按照行求和,axis=0是按照列求和
           

小結

  • narray

    的轉置是

    ar.T

    ,不是

    ar.T()

  • 用np的函數的有:

    np.resize()

    np.astype()

    、按行列求和

    np.sum(ar, axis=1)

    np.sort()

資料分析—科學計算工具numpy(下)

資料分析---科學計算工具numpy(上)

繼續閱讀