Numpy是Python的一個科學(xué)計算的庫股冗,提供了矩陣運算的功能夺鲜,其一般與Scipy、matplotlib一起使用姚建。其實矫俺,list已經(jīng)提供了類似于矩陣的表示形式,不過numpy為我們提供了更多的函數(shù)。
numpy下載
- Anaconda自帶
- pip install -i https://pypi.douban.com/simple numpy
numpy創(chuàng)建數(shù)組
數(shù)組創(chuàng)建函數(shù)
另外還有l(wèi)inspace函數(shù)厘托,可以在范圍內(nèi)創(chuàng)建數(shù)組,randn和rand也可以生成數(shù)組友雳。具體看下面代碼
import numpy as np
print('使用zeros/empty/ones')
print(np.zeros(10))# 生成包含10個0的一維數(shù)組
print(np.zeros((3, 6)))# 生成3*6的二維數(shù)組
print(np.empty((2, 3, 2)))# 生成2*3*2的三維數(shù)組,所有元素未初始化
print(np.ones_like(np.arange(6).reshape(2,3)))#生成兩行三列形狀的用1填充的數(shù)組
#array和asarray都可以將結(jié)構(gòu)數(shù)據(jù)轉(zhuǎn)化為ndarray
# 但是主要區(qū)別就是當(dāng)數(shù)據(jù)源是ndarray時铅匹,array仍然會copy出一個副本押赊,占用新的內(nèi)存,但asarray不會
#在這個例子中array和asarray沒有區(qū)別包斑,都對元數(shù)據(jù)進行了復(fù)制
data1=[[1,1,1],[1,1,1],[1,1,1]]
arr2=np.array(data1)
arr3=np.asarray(data1)
data1[1][1]=2
print('data1:\n',data1)
print('arr2:\n',arr2)
print('arr3:\n',arr3)
arr1=np.ones((3,3))
arr2=np.array(arr1)
arr3=np.asarray(arr1)
arr1[1]=2
print('arr1:\n',arr1)
print('arr2:\n',arr2)
print('arr3:\n',arr3)
#np.identity只能創(chuàng)建方形矩陣
#np.eye可以創(chuàng)建矩形矩陣流礁,且k值可以調(diào)節(jié),為1的對角線的位置偏離度舰始,0居中崇棠,1向上偏離1,2偏離2丸卷,以此類推枕稀,-1向下偏離
#numpy.eye(N,M=None, k=0, dtype=<type 'float'>)
#第一個參數(shù):輸出方陣(行數(shù)=列數(shù))的規(guī)模,即行數(shù)或列數(shù)
#第三個參數(shù):默認(rèn)情況下輸出的是對角線全“1”谜嫉,其余全“0”的方陣萎坷,如果k為正整數(shù),則在右上方第k條對角線全“1”其余全“0”沐兰,k為負(fù)整數(shù)則在左下方第k條對角線全“1”其余全“0”哆档。
print(np.identity(3))
print(np.eye(3))
print(np.eye(3,k=1))
#補充numpy.linspace方法,例如住闯,在從1到3中產(chǎn)生9個數(shù):
print(np.linspace(1,3,9).reshape(3,3))
#numpy中有一些常用的用來產(chǎn)生隨機數(shù)的函數(shù)瓜浸,randn()和rand()就屬于這其中。
#numpy.random.randn(d0, d1, …, dn)是從標(biāo)準(zhǔn)正態(tài)分布中返回一個或多個樣本值比原。
#numpy.random.rand(d0, d1, …, dn)的隨機樣本位于[0, 1)中
arr1 = np.random.randn(2,4)#2行4列數(shù)組
print(arr1)
print('******************************************************************')
arr2 = np.random.rand(2,4)
print(arr2)
numpy數(shù)據(jù)類型
數(shù)據(jù)類型1
數(shù)據(jù)類型2
數(shù)據(jù)類型的操作
- 創(chuàng)建ndarray時指定dtype類型
- 使用astype顯示轉(zhuǎn)換類型
print('生成數(shù)組時指定數(shù)據(jù)類型')
arr = np.array([1, 2, 3], dtype = np.float64)
print(arr)
print(arr.dtype)
arr = np.array([1, 2, 3], dtype = np.int32)
print(arr)
print(arr.dtype)
print('使用astype復(fù)制數(shù)組并轉(zhuǎn)換數(shù)據(jù)類型')
int_arr = np.array([1, 2, 3, 4, 5])
float_arr = int_arr.astype(np.float)
print(int_arr.dtype)
print(float_arr.dtype)
print('使用astype將float轉(zhuǎn)換為int時小數(shù)部分被舍棄')
float_arr = np.array([3.7, -1.2, -2.6, 0.5, 12.9, 10.1])
int_arr = float_arr.astype(dtype = np.int)
print(int_arr)
print('使用astype把字符串轉(zhuǎn)換為數(shù)組插佛,如果失敗拋出異常。')
str_arr = np.array(['1.25', '-9.6', '42'], dtype = np.string_)
float_arr = str_arr.astype(dtype = np.float)
print(float_arr)
print('astype使用其它數(shù)組的數(shù)據(jù)類型作為參數(shù)')
int_arr = np.arange(10)
float_arr = np.array([.23, 0.270, .357, 0.44, 0.5], dtype = np.float64)
print(int_arr.astype(float_arr.dtype))
print(int_arr[0], int_arr[1]) # astype做了復(fù)制量窘,數(shù)組本身不變雇寇。
NumPy的ndarray 數(shù)組和標(biāo)量之間的運算
不用編寫循環(huán)即可對數(shù)據(jù)執(zhí)行批量運算
大小相等的數(shù)組之間的任何算術(shù)運算都會將運算應(yīng)用到元素級
數(shù)組與標(biāo)量的算術(shù)運算也會將那個標(biāo)量值傳播到各個元素
# 數(shù)組乘法/減法,對應(yīng)元素相乘/相減蚌铜。
arr = np.array([[1.0, 2.0, 3.0], [4., 5., 6.]])
print(arr * arr)
print(arr - arr)
print
# 標(biāo)量操作作用在數(shù)組的每個元素上
arr = np.array([[1.0, 2.0, 3.0], [4., 5., 6.]])
print(1 / arr)
print(arr ** 0.5) # 開根號
NumPy的ndarray 基本的索引和切片
- 數(shù)組切片
a = np.array([2, 0, 1, 5, 8, 3])
#類似于列表的切片
print(a[:-2])#[2 0 1 5]
print(a[-2:])#[8 3]
print(a[:1])#[2]
print(a[::-1])#反轉(zhuǎn)[3 8 5 1 0 2]
print(a[0:-1:2])#[2 1 8]
print('使用切片訪問和操作數(shù)組')
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(arr[1:6]) # 打印元素arr[1]到arr[5]
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[:2]) # 打印第1锨侯、2行
print(arr[:2, 1:]) # 打印第1、2行冬殃,第2囚痴、3列
print(arr[:, :1]) # 打印第一列的所有元素
arr[:2, 1:] = 0 # 第1、2行审葬,第2深滚、3列的元素設(shè)置為0
print(arr)
- 通過索引操作
# 通過索引訪問二維數(shù)組某一行或某個元素
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[2])
print(arr[0][2])
print(arr[0, 2]) # 普通Python數(shù)組不能用骂束。
print
# 對更高維數(shù)組的訪問和操作
arr = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
print(arr[0]) # 結(jié)果是個2維數(shù)組
print(arr[1, 0]) # 結(jié)果是個2維數(shù)組
old_values = arr[0].copy() # 復(fù)制arr[0]的值
arr[0] = 42 # 把arr[0]所有的元素都設(shè)置為同一個值
print(arr)
arr[0] = old_values # 把原來的數(shù)組寫回去
print(arr)
- ndarray 布爾型索引、
import numpy as np
import numpy.random as np_random
print('使用布爾數(shù)組作為索引')
name_arr = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
rnd_arr = np_random.randn(7, 4) # 隨機7*4數(shù)組
print(rnd_arr)
print(name_arr == 'Bob') # 返回布爾數(shù)組成箫,元素等于'Bob'為True展箱,否則False。
print(rnd_arr[name_arr == 'Bob']) # 利用布爾數(shù)組選擇行,顯示第一行和第四行
print(rnd_arr[name_arr == 'Bob', :2]) # 在上一個的基礎(chǔ)上增加限制打印列的范圍
print(rnd_arr[-(name_arr == 'Bob')]) # 對布爾數(shù)組的內(nèi)容取反蹬昌,布爾數(shù)組選擇行反轉(zhuǎn)
mask_arr = (name_arr == 'Bob') | (name_arr == 'Will') # 邏輯運算混合結(jié)果
print(rnd_arr[mask_arr])
rnd_arr[name_arr != 'Joe'] = 7 # 先布爾數(shù)組選擇行混驰,然后把每行的元素設(shè)置為7。
print(rnd_arr)
- ndarray 花式索引
print('Fancy Indexing: 使用整數(shù)數(shù)組作為索引')
arr = np.empty((8, 4))
for i in range(8):
arr[i] = i
print(arr)
print(arr[[4, 3, 0, 6]]) # 打印arr[4]皂贩、arr[3]栖榨、arr[0]和arr[6]。
print(arr[[-3, -5, -7]]) # 打印arr[5]明刷、arr[3]和arr[1]行
arr = np.arange(32).reshape((8, 4)) # 通過reshape變換成二維數(shù)組
print(arr)
print(arr[[1, 5, 7, 2], [0, 3, 1, 2]]) # 打印arr[1, 0]婴栽、arr[5, 3],arr[7, 1]和arr[2, 2]
print(arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]) # 1572行的0312列
print(arr[np.ix_([1, 5, 7, 2], [0, 3, 1, 2])]) # 可讀性更好的寫法
NumPy的ndarray 數(shù)組轉(zhuǎn)置和軸對換
import numpy as np
import numpy.random as np_random
print('轉(zhuǎn)置矩陣')
arr = np.arange(15).reshape((3, 5))
print(arr)
print(arr.T)
print
print('轉(zhuǎn)置矩陣做點積')
arr = np_random.randn(6, 3)
print(arr)
print(np.dot(arr.T, arr))
print
print('高維矩陣轉(zhuǎn)換')
arr = np.arange(16).reshape((2, 2, 4))
print(arr)
'''
詳細(xì)解釋:
arr數(shù)組的內(nèi)容為
- a[0][0] = [0, 1, 2, 3]
- a[0][1] = [4, 5, 6, 7]
- a[1][0] = [8, 9, 10, 11]
- a[1][1] = [12, 13, 14, 15]
transpose的參數(shù)為坐標(biāo)辈末,正常順序為(0, 1, 2, ... , n - 1)愚争,
現(xiàn)在傳入的為(1, 0, 2)代表a[x][y][z] = a[y][x][z],第0個和第1個坐標(biāo)互換挤聘。
- a'[0][0] = a[0][0] = [0, 1, 2, 3]
- a'[0][1] = a[1][0] = [8, 9, 10, 11]
- a'[1][0] = a[0][1] = [4, 5, 6, 7]
- a'[1][1] = a[1][1] = [12, 13, 14, 15]
'''
print(arr.transpose((1, 0, 2)))
print(arr.swapaxes(1, 2)) # 直接交換第1和第2個坐標(biāo)
NumPy的ndarray 快速的元素級數(shù)組函數(shù)
- 一元函數(shù) I
一元函數(shù)1
- 一元函數(shù) II
一元函數(shù)2
- 二元函數(shù) I
二元函數(shù)1
- 二元函數(shù) II
二元函數(shù)2
import numpy as np
import numpy.random as np_random
print('求平方根')
arr = np.arange(10)
print(np.sqrt(arr))
print('數(shù)組比較')
x = np_random.randn(8)
y = np_random.randn(8)
print(x)
print(y)
#取兩個舉證相同位置的最大值
print(np.maximum(x, y))
print('使用modf函數(shù)把浮點數(shù)分解成整數(shù)和小數(shù)部分')
arr = np_random.randn(7) * 5 # 統(tǒng)一乘5
print(np.modf(arr))