1. 程式人生 > >1.python資料分析與展示----Numpy

1.python資料分析與展示----Numpy

1.資料的維度

一維資料:一維資料由對等關係的有序或無序資料構成,採用線性方式組織,如:

                                   3.1413, 3.1398, 3.1404, 3.1401, 3.1349, 3.1376

對應列表、陣列和集合等概念

列表和陣列的區別:

列表:資料型別可以不同 如: 3.1413, 'pi', 3.1404, [3.1401, 3.1349], '3.1376'

陣列:資料型別相同   如:3.1413, 3.1398, 3.1404, 3.1401, 3.1349, 3.1376

二維資料:二維資料由多個一維資料構成,是一維資料的組合形式

表格是典型的二維資料 其中,表頭是二維資料的一部分,如下圖


多維資料:多維資料由一維或二維資料在新維度上擴充套件形成


高維資料:高維資料僅利用最基本的二元關係展示資料間的複雜結構


資料維度的Python表示:資料維度是資料的組織形式



2.Numpy

NumPy是一個開源的Python科學計算基礎庫,包含:

                        •一個強大的N維陣列物件ndarray

                        •廣播功能函式

                        •整合C/C++/Fortran程式碼的工具

                        •線性代數、傅立葉變換、隨機數生成等功能

NumPy是SciPy、Pandas等資料處理或科學計算庫的基礎

1.陣列物件ndarray

python陣列型別與ndarray的區別:

•陣列物件可以去掉元素間運算所需的迴圈,使一維向量更像單個數據

•設定專門的陣列物件,經過優化,可以提升這類應用的運算速度


ndarray是一個多維陣列物件,由兩部分構成:

•實際的資料 

•描述這些資料的元資料(資料維度、資料型別等)

ndarray陣列一般要求所有元素型別相同(同質),陣列下標從0開始

ndarray物件的屬性


ndarray陣列的元素型別


對比:Python語法僅支援整數、浮點數和複數3種類型
•科學計算涉及資料較多,對儲存和效能都有較高要求
•對元素型別精細定義,有助於NumPy合理使用儲存空間並優化效能

•對元素型別精細定義,有助於程式設計師對程式規模有合理評估


ndarray陣列的建立方法

①從Python中的列表、元組等型別建立ndarray陣列


import numpy as np

x=np.array([1,2,3,4])#從列表型別建立
print(x)
x=np.array((1,2,3,4))#從元組型別建立
print(x)
x=np.array([[1,2,3,4],(1,2,3,4)])#從列表和元組混合型別建立
print(x)

[1 2 3 4]
[1 2 3 4]
[[1 2 3 4]
 [1 2 3 4]]

②使用NumPy中函式建立ndarray陣列,如:arange, ones, zeros等


print(np.arange(10))
#[0 1 2 3 4 5 6 7 8 9]
print(np.ones((3,6)))
# [[1. 1. 1. 1. 1. 1.]
#  [1. 1. 1. 1. 1. 1.]
#  [1. 1. 1. 1. 1. 1.]]
print(np.zeros((3,6),dtype=np.int32))
# [[0 0 0 0 0 0]
#  [0 0 0 0 0 0]
#  [0 0 0 0 0 0]]
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.]]
x=np.ones((2,3,4));
print(x)
# [[[1. 1. 1. 1.]
#   [1. 1. 1. 1.]
#   [1. 1. 1. 1.]]
#
#  [[1. 1. 1. 1.]
#   [1. 1. 1. 1.]
#   [1. 1. 1. 1.]]]
print(x.shape)
#(2, 3, 4)

③使用NumPy中其他函式建立ndarray陣列


a=np.linspace(1,10,4)
print(a)
#[ 1.  4.  7. 10.]
b=np.linspace(1,10,4,endpoint=False)
print(b)
# [1.   3.25 5.5  7.75]
print(np.concatenate((a,b)))
# [ 1.    4.    7.   10.    1.    3.25  5.5   7.75]

3.ndarray陣列的變換

對於建立後的ndarray陣列,可以對其進行維度變換和元素型別變換


a=np.ones((2,3,4),dtype=np.int32)
print(a.reshape((3,8)))
# [[1 1 1 1 1 1 1 1]
#  [1 1 1 1 1 1 1 1]
#  [1 1 1 1 1 1 1 1]]
print(a)
# [[[1 1 1 1]
#   [1 1 1 1]
#   [1 1 1 1]]
#
#  [[1 1 1 1]
#   [1 1 1 1]
#   [1 1 1 1]]]
a.resize((3,8))
print(a)
# [[1 1 1 1 1 1 1 1]
#  [1 1 1 1 1 1 1 1]
#  [1 1 1 1 1 1 1 1]]

astype()方法一定會建立新的陣列(原始資料的一個拷貝),即使兩個型別一致

a=np.ones((2,3,4),dtype=np.int32)
print(a)
#  [[1 1 1 1]
#   [1 1 1 1]
#   [1 1 1 1]]]
# [[[1 1 1 1]
#   [1 1 1 1]
#   [1 1 1 1]]
b=a.astype(np.float32)
print(b)
# [[[1. 1. 1. 1.]
#   [1. 1. 1. 1.]
#   [1. 1. 1. 1.]]
#
#  [[1. 1. 1. 1.]
#   [1. 1. 1. 1.]
#   [1. 1. 1. 1.]]]
a=np.full((2,3,4),25,dtype=np.int32)
print(a)
# [[[25 25 25 25]
#   [25 25 25 25]
#   [25 25 25 25]]
#
#  [[25 25 25 25]
#   [25 25 25 25]
#   [25 25 25 25]]]
print(a.tolist())
[[[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]],
[[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]]]

陣列的索引和切片

索引:獲取陣列中特定位置元素的過程

切片:獲取陣列元素子集的過程

一維陣列的索引和切片:與Python的列表類似

a=np.array([9,8,7,6,5])
print(a[2])
#7
print(a[1:4:2])
#起始編號終止編號(不含): 步長,3元素冒號分割
#編號0開始從左遞增,或‐1開始從右遞減
#[8 6]

多維陣列的索引:

a=np.arange(24).reshape((2,3,4))
print(a)
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
#
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]
print(a[1,2,3])
#每個維度一個索引值,逗號分割
#23

多維陣列的切片:

a=np.arange(24).reshape((2,3,4))
print(a)
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
#
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]
print(a[:,1,-3])
# [ 5 17]
print(a[:,1:3,:])
# [[[ 4  5  6  7]
#   [ 8  9 10 11]]
#
#  [[16 17 18 19]
#   [20 21 22 23]]]
print(a[:,:,::2])
#每個維度可以使用 步長跳躍切片
# [[[ 0  2]
#   [ 4  6]
#   [ 8 10]]
#
#  [[12 14]
#   [16 18]
#   [20 22]]]

陣列與標量之間的運算:陣列與標量之間的運算作用於陣列的每一個元素

a=np.arange(24).reshape((2,3,4))
print(a)
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
#
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]
print(a.mean())
#11.5
a =a/a.mean()
print(a)
# [[[0.         0.08695652 0.17391304 0.26086957]
#   [0.34782609 0.43478261 0.52173913 0.60869565]
#   [0.69565217 0.7826087  0.86956522 0.95652174]]
#
#  [[1.04347826 1.13043478 1.2173913  1.30434783]
#   [1.39130435 1.47826087 1.56521739 1.65217391]
#   [1.73913043 1.82608696 1.91304348 2.        ]]]

NumPy一元函式 



a=np.arange(24).reshape((2,3,4))
print(a)
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
#
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]
print(np.square(a))
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
#
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]
# [[[  0   1   4   9]
#   [ 16  25  36  49]
#   [ 64  81 100 121]]
#
#  [[144 169 196 225]
#   [256 289 324 361]
#   [400 441 484 529]]]
a=np.sqrt(a)
print(a)
# [[[0.         1.         1.41421356 1.73205081]
#   [2.         2.23606798 2.44948974 2.64575131]
#   [2.82842712 3.         3.16227766 3.31662479]]
#
#  [[3.46410162 3.60555128 3.74165739 3.87298335]
#   [4.         4.12310563 4.24264069 4.35889894]
#   [4.47213595 4.58257569 4.69041576 4.79583152]]]
print(np.modf(a))
# (array([[[0.        , 0.        , 0.41421356, 0.73205081],
#         [0.        , 0.23606798, 0.44948974, 0.64575131],
#         [0.82842712, 0.        , 0.16227766, 0.31662479]],
#
#        [[0.46410162, 0.60555128, 0.74165739, 0.87298335],
#         [0.        , 0.12310563, 0.24264069, 0.35889894],
#         [0.47213595, 0.58257569, 0.69041576, 0.79583152]]]),
# array([[[0., 1., 1., 1.],
#         [2., 2., 2., 2.],
#         [2., 3., 3., 3.]],
#
#        [[3., 3., 3., 3.],
#         [4., 4., 4., 4.],
#         [4., 4., 4., 4.]]]))

NumPy二元函式:


b=np.sqrt(a)
print(b)
# [[[0.         1.         1.41421356 1.73205081]
#   [2.         2.23606798 2.44948974 2.64575131]
#   [2.82842712 3.         3.16227766 3.31662479]]
#
#  [[3.46410162 3.60555128 3.74165739 3.87298335]
#   [4.         4.12310563 4.24264069 4.35889894]
#   [4.47213595 4.58257569 4.69041576 4.79583152]]]
print(np.maximum(a,b))
#運算結果為浮點數
# [[[ 0.  1.  2.  3.]
#   [ 4.  5.  6.  7.]
#   [ 8.  9. 10. 11.]]
#
#  [[12. 13. 14. 15.]
#   [16. 17. 18. 19.]
#   [20. 21. 22. 23.]]]
print(a>b)
# [[[False False  True  True]
#   [ True  True  True  True]
#   [ True  True  True  True]]
# 
#  [[ True  True  True  True]
#   [ True  True  True  True]
#   [ True  True  True  True]]]