1. 程式人生 > >Numpy學習一

Numpy學習一

啥都甭說了,上程式碼!

# -*- coding: utf-8 -*-
"""
Created on Mon Sep 24 11:27:35 2018

@author: Lxiao217
"""

import numpy as np
import matplotlib.pyplot as plt
a = np.arange(12).reshape(3,4)
print(a.ndim) #陣列的軸數-----2
print(a.shape) #陣列的大小-----(3,4
print(a.size) #元素總數-----12
print(a.dtype)#元素型別的物件-----int32
print(a.itemsize)#每個元素的大小-----4(位元組為單位)
print(a.data) #包含陣列實際元素的緩衝區-----<memory at 0x...>
print(type(a))#陣列型別-----<class 'numpy.ndarray'>
print(type(np.array([1,2,3])))#內建的array-----<class 'numpy.ndarray'>
print('\n')
#陣列的建立
b = np.array([(1.1,2.2,3.3),(4.4,5.5,6.6)])
print(b)    
'''[[1.1 2.2 3.3] 
    [4.4 5.5 6.6]]'''
c = np.array([[1,2],[3,4],[5,6]], dtype = complex)
print(c)
'''
[[1.+0.j 2.+0.j]
 [3.+0.j 4.+0.j]
 [5.+0.j 6.+0.j]]
'''
print(np.zeros((2,2)))
print(np.ones((2,2), dtype = np.int16))
print(np.empty((2,2)))#empty建立的陣列的初始值是隨機的,型別是float64
print('\n')

print(np.arange(0,2,0.3))
#對於浮點數使用arange由於有限的浮點精度,無法知道元素的數量,因此使用linespace
#-----[0.  0.3 0.6 0.9 1.2 1.5 1.8]
x = np.linspace(0,2*np.pi,100)
#將0~pi取100(4)個點 -----[0.         1.04719755 2.0943951  3.14159265]
plt.plot(x, np.sin(2*x)) 
#還有abs,exp等數學函式,這些函式在陣列上以元素方式執行,產生一個數組作為輸出
#a.sum()求所有元素的和,a.max(),a.min()
#a.sum(axis=1)求axis=1的所有元素的和
print('\n')

d = np.array([1,2,3,4]).reshape(2,2)
print(d ** 2)
'''
[[ 1  4]
 [ 9 16]]
'''
print(
[email protected]
) #python3.5以上可用 print(np.dot(d,d)) '''點積,兩個結果都是: [[ 7 10] [15 22]] ''' #d *=3 #*=和+=會改變原來陣列的值 print(d) ''' [[1 2] [3 4]] ''' print(d.sum(axis=1)) #[3 7],axis=0結果是[4 6] print('\n') e = np.arange(10) #[0 1 2 3 4 5 6 7 8 9] e[2:5] #[2 3 4]前閉後開 e[:8:2] = 66 #[66 1 66 3 66 5 66 7 8 9] f = e[::-1] #[ 9 8 7 66 5 66 3 66 1 66]翻轉e print(f) print('\n') def g(x,y): return(5*x + y) h = np.fromfunction(g, (4,5), dtype = np.int32) ''' [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14] [15 16 17 18 19]] ''' i = h[0:4,3] #[ 3 8 13 18],取0-3行的列3,寫0:500超範圍也只會取0:3,不會報錯 print(i) ''' #多維陣列的迭代是針對第一維進行的 j = h.reshape(2,5,2) for row in j: print(row) for element in j.flat: #使用flat屬性針對每個元素進行迭代 print(element) ''' print(h.T) #轉置 print(h.reshape(2,-1)) #將某個維度指定為-1,則會自動計算其他尺寸 print('\n') #堆疊不同的陣列 k = np.array(([[2,3],[5,6]],[[7,8],[9,10]])) #注意不能少一層括號 l = np.array(([[12,3],[15,6]],[[17,8],[19,10]])) m = np.vstack((k,l)) #還有hstack n = np.column_stack((k,l)) #相當於hstack #還有np.row_stack(),相當於vstack '''m: [[[ 2 3] [ 5 6]] [[ 7 8] [ 9 10]] [[12 3] [15 6]] [[17 8] [19 10]]] ''' o = np.r_[2:9:2,8,2] #o: [2 4 6 8 8 2] print('o:',o) print() p = np.floor(np.arange(10)) #[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.] np.hsplit(p,5) #[array([0., 1.]), array([2., 3.]), array([4., 5.]), array([6., 7.]), array([8., 9.])] q = p print(p is q)#True 簡單分配不會複製物件及其資料 def s(x): return(id(x)) r = id(p) #2205693815984 t = s(p) #2205693815984 Python將可變物件作為引用傳遞,因此函式呼叫不會複製 print() #淺拷貝 u = p.view() #[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.],相當於p的引用,淺拷貝 u is p #False,View方法建立一個檢視相同資料的新陣列物件 u.base is p #True,u是檢視p資料的檢視 u.flags.owndata #False u.shape #(10,) u[6] = 7 #p也發生了改變,p: [0. 1. 2. 3. 4. 5. 7. 7. 8. 9.] ''' a: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] ''' v = a[:,0:3] #取所有的行,0,1,2三列 v[:] = 10 #v的所有元素都賦為10 w = v.copy() w is v #False w[:,0:2] = 5 #w會發生改變,但是v不會改變,這是深拷貝 #花式索引和索引技巧 aa = np.arange(8) ** 3 i = np.array([1,3,5,7]) print(aa[i]) #[ 1 27 125 343] j = np.array([[3,4],[5,7]]) print(aa[j]) ''' [[ 27 64] [125 343]] '''