NumPy

#1行5列
data = np.array([1,2,3,4,5])
data.shape
(5,)
#3行4列
data = np.array([[1,2,3,0],[4,5,6,0],[7,8,9,0]])  
data.shape
(3, 4)
# 2行3列2維
data = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
data.shape
(2, 2, 3)
data.dtype
dtype('int64')

1.創建ndarray

   ndarray是NumPy中多維數組對象,是一個快速而靈活的大數據容器,其中所有元素必須具有相同類型

Numpy中如果沒有特殊指定,數據類型基本都是float64(浮點型)

import numpy as np

data = [6,7.5,8,0,1]

arr1 = np.array(data)   #創建一維矩陣 
arr1
array([6. , 7.5, 8. , 0. , 1. ])
arr1.shape        #返回一個表示各維度大小的元組,第一個數標識
(5,)
arr1.dtype       #返回一個說明數組數據類型的對象,numpy關注的是數值運算,默認float64 浮點數,數據類型
dtype('float64')
data = [[1,2,3,4],[5,6,7,8]]   #創建二維矩陣
arr2 = np.array(data)
arr2 
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])

zeros()

創建全0矩陣

np.zeros(10)      #創建 1x10x1  全0矩陣
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np.zeros((3,6))   #創建3x6x1    全0矩陣    3行6列,1維矩陣
array([[0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.]])
np.zeros((2,3,3))  #創舉3x3x2 全0矩陣    3行3列,2維矩陣
array([[[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]],

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

ones()

創建全1矩陣

np.ones(10)    #創建 1x10x1  全1矩陣
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
np.ones((3,6))   #創建3x6x1    全1矩陣    3行6列,1維矩陣
array([[1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1.]])
np.ones((2,3,4))
array([[[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]],

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

empty()

可以創建一個沒有任何具體值的數組

np.empty((2,3,2))   # 2列,3行,2維
                    #返回的是未經初始化的垃圾值
array([[[6.94646086e-310, 4.64671213e-310],
        [6.94645989e-310, 6.94645967e-310],
        [6.94645994e-310, 3.21142670e-322]],

       [[6.94646086e-310, 4.64671213e-310],
        [0.00000000e+000, 0.00000000e+000],
        [0.00000000e+000, 0.00000000e+000]]])

arange()

是python內置函數range的數組版本,返回的是一個ndarray而不是列表

np.arange(15)
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

2.ndarray的數據類型

類型 類型代碼 說明
int8,uint8 i1,u1 有符號和無符號的8位(1字節)整型
int16,uint16 i2,u2 有符號和無符號的16位(2字節)整型
int32,uint32 i4,u4 有符號和無符號的32位(4字節)整型
int64,uint64 i8,u8 有符號和無符號的64位(8字節)整型
float16 f2 半精度浮點數
float32 f4或f 標準的單精度浮點數.與C的float兼容
float64 f8或d 標準雙精度浮點數.與C的double和python的float對象兼容
float128 f16或g 擴展精度浮點數
complex64,complex128,complex256 c8,c16,c32 分別用兩個32位,64位或128位浮點數表示的複數
bool ? 存儲True和False值的布爾類型
object O Python對象類型
string_ S 固定長度的字符串類型(每個字符1個字節).
例如:要創建一個長度爲10的字符串,應使用S10
unicode_ U 固定長度的unicode類型(字節數由平臺決定).
跟字符串的定義方式一樣(如U10)

2.1 astype()數據類型轉化

調用astype無論如何都會創建出一個新的數組(原始數組的一份拷貝),即使新dtype跟老dtype相同也是如此

注意 浮點數(比如float64和float32)只能表示近似的分數值.在複雜計算中,由於可能會積累一些浮點錯誤,因此比較操作只能在一定小數位內有效

整數轉爲浮點數

arr = np.array([1,2,3,4,5])
arr.dtype
dtype('int64')
float_arr = arr.astype(np.float64)
float_arr.dtype
dtype('float64')

浮點數轉爲整數

轉換過程中小數部分會直接被截斷

arr = np.array([3.7,-1.2,-2.6,0.5,12.9,10.1])
arr.dtype
dtype('float64')
arr.astype(np.int32)
array([ 3, -1, -2,  0, 12, 10], dtype=int32)

全是數字的字符串數組 轉爲 數值

numeric_strings = np.array(['1.25','-9.6','42'],dtype=np.string_)
numeric_strings.astype(float)
array([ 1.25, -9.6 , 42.  ])
numeric_strings.astype(np.float64)
array([ 1.25, -9.6 , 42.  ])

支持參數是返回的數據類型

int_array = np.arange(10)
calibers = np.array([.27,.270,.357,.380,.44,.50],dtype=np.float64)
int_array.astype(calibers.dtype)
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])

使用類型代碼定義數據類型

empty_uint32 = np.empty(8,dtype='u4')
empty_uint32
array([         0, 1075314688,          0, 1075707904,          0,
       1075838976,          0, 1072693248], dtype=uint32)

3.索引和切片

3.1 一維數組

arr = np.arange(10)
arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[:]
array([ 0,  1,  2,  3,  4, 12, 12, 12,  8,  9])
arr[5]        #第6個元素
5
arr[5:8]      #第6個元素到第8個元素
array([5, 6, 7])

數組中 值的更改

跟列表最重要的區別在於,數組切片是原始數組的視圖.這意味着數據不會被複制,視圖上的任何修改都會直接反應到源數據上

arr[5:8] = 12
arr
array([ 0,  1,  2,  3,  4, 12, 12, 12,  8,  9])
arr_slice = arr[5:8]
arr_slice
array([12, 12, 12])
arr_slice[1] = 145
arr
array([  0,   1,   2,   3,   4,  64, 145,  64,   8,   9])
arr_slice[:] = 64
arr
array([ 0,  1,  2,  3,  4, 64, 64, 64,  8,  9])

其他用法

old_data = data.copy()
data[data < 0] = 0
data
array([[0.        , 1.69865101, 0.        , 0.49518769],
       [0.37951591, 0.        , 0.        , 0.        ],
       [0.44686031, 2.0746266 , 1.68538262, 0.        ],
       [0.37011546, 0.        , 0.7600543 , 0.        ],
       [0.        , 0.        , 0.        , 0.        ],
       [0.        , 0.79192211, 0.        , 0.        ],
       [2.92470818, 0.        , 0.26734807, 0.94358864]])
data[names != 'Joe'] = 7
data
array([[7.        , 7.        , 7.        , 7.        ],
       [0.37951591, 0.        , 0.        , 0.        ],
       [7.        , 7.        , 7.        , 7.        ],
       [7.        , 7.        , 7.        , 7.        ],
       [7.        , 7.        , 7.        , 7.        ],
       [0.        , 0.79192211, 0.        , 0.        ],
       [2.92470818, 0.        , 0.26734807, 0.94358864]])

3.2 二維數組

各索引位置上的元素不再是標量而是一維數組

arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr2d
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
arr2d[2]              #獲取 第3行元素
array([7, 8, 9])
print(arr2d[0][2])      #獲取 1行3列的值
print(arr2d[0,2])
3
3
arr2d[:1]         #返回第 1行
array([[1, 2, 3]])
arr2d[:2]         #返回前 2行
array([[1, 2, 3],
       [4, 5, 6]])
arr2d[:3]        #返回前 3行,即所有
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
arr2d[:2,1:]     # 返回前2行, 從第 2列到最後一列 所有元素
array([[2, 3],
       [5, 6]])
arr2d[:2,2:]     # 返回前2行,從第 3列到最後一列(即最後一列)所有元素
array([[3],
       [6]])
arr2d[:2,:1]     # 返回前 2行,第 1列的值
array([[1],
       [4]])
arr2d[:2,:2]     # 返回前 2行,第 1列 到 第 2列的值
array([[1, 2],
       [4, 5]])
arr2d[:2,1:2]    # 返回前 2行,第 2列的值
array([[2],
       [5]])

3.3 多維數組

第一個數表示 維度, 第二個數表示行, 第三個數表示列

arr3d = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
arr3d    # 2行3列2維度
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])
arr3d[0]     # 返回第一維度的數組
array([[1, 2, 3],
       [4, 5, 6]])
arr3d[1,0]   # 返回第二維度第一行數據
array([7, 8, 9])

3.4 複製–數組切片

.copy() 得到的是ndarray切片的一份副本而非視圖

old_values = arr3d[0].copy()
arr3d[0] = 42
arr3d
array([[[42, 42, 42],
        [42, 42, 42]],

       [[ 7,  8,  9],
        [10, 11, 12]]])
arr3d[0] = old_values
arr3d
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])

3.5 布爾型索引

布爾型數組的長度必須跟被索引的數組的行數一致

Python關鍵字 and 和 or 在布爾型數組中無效

names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
data = np.random.randn(7,4)   #使用numpy.random中的randn函數生成一些正態分佈的隨機數
names
array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='<U4')
data
array([[-0.69367557,  1.69865101, -0.23921684,  0.49518769],
       [ 0.37951591, -1.12286914, -0.45468043, -0.0389243 ],
       [ 0.44686031,  2.0746266 ,  1.68538262, -0.10811949],
       [ 0.37011546, -0.65505409,  0.7600543 , -1.97341031],
       [-0.31347836, -1.11806019, -1.11968691, -0.73714439],
       [-0.94361467,  0.79192211, -0.23550452, -0.02805382],
       [ 2.92470818, -0.32589702,  0.26734807,  0.94358864]])
names == 'Bob'
array([ True, False, False,  True, False, False, False])
data[names == 'Bob']        # 返回第1行 和 第4行
array([[-0.69367557,  1.69865101, -0.23921684,  0.49518769],
       [ 0.37011546, -0.65505409,  0.7600543 , -1.97341031]])
data[names == 'Bob',2:]      # 返回第1行和第4行, 第3列到最後一列的值
array([[-0.23921684,  0.49518769],
       [ 0.7600543 , -1.97341031]])
data[names == 'Bob',3]      #將第4列,第1行和4行的值組成數組
array([ 0.49518769, -1.97341031])

使用 != 非 ~

names != 'Bob'
array([False,  True,  True, False,  True,  True,  True])
data[~(names == 'Bob')]      #返回非1和4行
array([[ 0.37951591, -1.12286914, -0.45468043, -0.0389243 ],
       [ 0.44686031,  2.0746266 ,  1.68538262, -0.10811949],
       [-0.31347836, -1.11806019, -1.11968691, -0.73714439],
       [-0.94361467,  0.79192211, -0.23550452, -0.02805382],
       [ 2.92470818, -0.32589702,  0.26734807,  0.94358864]])

使用 &(和), |(或)

mask = (names == 'Bob') | (names == 'Will')
mask
array([ True, False,  True,  True,  True, False, False])
data[mask]
array([[-0.69367557,  1.69865101, -0.23921684,  0.49518769],
       [ 0.44686031,  2.0746266 ,  1.68538262, -0.10811949],
       [ 0.37011546, -0.65505409,  0.7600543 , -1.97341031],
       [-0.31347836, -1.11806019, -1.11968691, -0.73714439]])

3.6 花式索引

指利用整數數組進行索引
花式索引跟切片不一樣,它總是將數據複製到新數組中

arr = np.empty((8,4))
for i in range(8):
    arr[i] = i
arr
array([[0., 0., 0., 0.],
       [1., 1., 1., 1.],
       [2., 2., 2., 2.],
       [3., 3., 3., 3.],
       [4., 4., 4., 4.],
       [5., 5., 5., 5.],
       [6., 6., 6., 6.],
       [7., 7., 7., 7.]])

以特定順序選取行子集

傳入一個用於指定的整數 列表 或ndarray即可

arr[[4,3,0,6]]
array([[4., 4., 4., 4.],
       [3., 3., 3., 3.],
       [0., 0., 0., 0.],
       [6., 6., 6., 6.]])
#使用負數索引將從末尾開始選取行
arr[[-3,-5,-7]]
array([[5., 5., 5., 5.],
       [3., 3., 3., 3.],
       [1., 1., 1., 1.]])
arr = np.arange(32).reshape((8,4))
arr
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22, 23],
       [24, 25, 26, 27],
       [28, 29, 30, 31]])
#矩陣(0,0)開始
#返回(1,0),(5,3),(7,1),(2,2)
arr[[1,5,7,2],[0,3,1,2]]    
array([ 4, 23, 29, 10])
arr[[1,5,7,2]][:,[0,3,1,2]]
array([[ 4,  7,  5,  6],
       [20, 23, 21, 22],
       [28, 31, 29, 30],
       [ 8, 11,  9, 10]])

np.ix_函數,它可以將兩個一維數組轉換爲一個用於選取方形區域的索引器

arr[np.ix_([1,5,7,2],[0,3,1,2])]
array([[ 4,  7,  5,  6],
       [20, 23, 21, 22],
       [28, 31, 29, 30],
       [ 8, 11,  9, 10]])

4. 數組轉置和軸對稱

arr = np.arange(15).reshape((3,5))
arr
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

Transpose 轉置

轉置是一種特殊形式,返回的是源數據的視圖(不會進行任何複製操作)

arr.T
array([[ 0,  5, 10],
       [ 1,  6, 11],
       [ 2,  7, 12],
       [ 3,  8, 13],
       [ 4,  9, 14]])
arr = np.arange(16).reshape((2,2,4))
arr
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])
arr.T
array([[[ 0,  8],
        [ 4, 12]],

       [[ 1,  9],
        [ 5, 13]],

       [[ 2, 10],
        [ 6, 14]],

       [[ 3, 11],
        [ 7, 15]]])

np.dot() 計算矩陣內積 XTXX^TX

arr
np.dot(arr.T,arr)
array([[125, 140, 155, 170, 185],
       [140, 158, 176, 194, 212],
       [155, 176, 197, 218, 239],
       [170, 194, 218, 242, 266],
       [185, 212, 239, 266, 293]])

swapaxes()

arr = np.arange(16).reshape((2,2,4))
arr.swapaxes(1,2)
array([[[ 0,  4],
        [ 1,  5],
        [ 2,  6],
        [ 3,  7]],

       [[ 8, 12],
        [ 9, 13],
        [10, 14],
        [11, 15]]])

5.通用函數(ufunc)

一元ufunc

函數 說明
abs,fabs 計算整數,浮點數或複數的絕對值
對於非複數值,可以使用更快的fabs
sqrt 計算各元素的平方根
square 計算各元素的平方
exp 計算各元素的指數exe^{x}
log,log10,log2,log1p 分別爲自然對數(底數爲e),底數爲10的log,底數爲2的log,log(1+x)
sign 計算各元素的正負號:1(正數),0(零),-1(負數)
ceil 計算各元素的ceiling值,即大於等於該值的最小整數
floor 計算個元素的floor值,即小於等於該值的最大整數
rint 將各元素值四捨五入到最接近的整數,保留dtype
modf 將數組的小數和整數部分以兩個獨立數組的形式返回
isnan 返回一個表示"哪些值是NaN(這不是一個數字)"的布爾型數組
isfinite,isinf 分別返回一個表示"哪些元素是又窮的(非inf,非NaN)"或"哪些元素是無窮的"的布爾型數組
cos,cosh,sin,sinh,tan,tanh 普通型和雙曲型三角函數
arccos,arccosh,arcsin,arcsinh,arctan,arctanh 反三角函數
logical_not 計算各元素not x的真值
import numpy as np
arr = np.arange(10)
arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.sqrt(arr)
array([0.        , 1.        , 1.41421356, 1.73205081, 2.        ,
       2.23606798, 2.44948974, 2.64575131, 2.82842712, 3.        ])
np.exp(arr)
array([1.00000000e+00, 2.71828183e+00, 7.38905610e+00, 2.00855369e+01,
       5.45981500e+01, 1.48413159e+02, 4.03428793e+02, 1.09663316e+03,
       2.98095799e+03, 8.10308393e+03])

二元ufunc

函數 說明
add 將數組中對應的元素相加
subtract 從第一個數組中減去第二個數組中的元素
multiply 數組元素相乘
divide,floor_divide 除法或向下圓整除法(丟棄餘數)
power 對第一個數組的元素A,根據第二個數組中的相應元素B,計算ABA^B
maximum,fmax 元素級的最大值計算.fmax將忽略NaN
minimum,fmin 元素級的最小值計算.fmin將忽略NaN
mod 元素級的求模計算(除法的餘數)
copysign
greater,greater_equal,less,less_equal,equal,not_equal 執行元素級的比較運算,最終產生布爾型數組.相當於中綴運算>,>=,<,<=,==,!=
logical_and,logical_or,logical_xor 執行元素級的真值邏輯運算.
相當於&,|,^
x = np.random.randn(8)
x
array([ 0.7782637 ,  2.01053018,  1.35868291,  0.21749182,  0.01305496,
        0.38470116, -1.57178628,  2.19639081])
y = np.random.randn(8)
y
array([ 1.28050252, -1.77657855,  0.23944536,  0.21039616, -0.75090526,
        1.06167301,  0.18368341, -0.63631676])
np.maximum(x,y)
array([1.28050252, 2.01053018, 1.35868291, 0.21749182, 0.01305496,
       1.06167301, 0.18368341, 2.19639081])
np.modf(x)
(array([ 0.7782637 ,  0.01053018,  0.35868291,  0.21749182,  0.01305496,
         0.38470116, -0.57178628,  0.19639081]),
 array([ 0.,  2.,  1.,  0.,  0.,  0., -1.,  2.]))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章