python學習--numpy的數組


numpy中的數組類型為ndarry

創建

# -*- coding: utf-8 -*-
import numpy as np

#用列表或元組創建
a = np.array([[1,2,3],[4,5,6]])
b = np.array([1,2],dtype=complex)

#類似內置函數range
c = np.arange(24).reshape(2,3,4)

#等差,等比數組
d = np.linspace(0,1,10,endpoint=False)
print np.logspace(0,4,3,base=2)

#創建特殊數組
print np.zeros((2,3))
print np.zeros_like(a)
print np.ones((2,3),dtype=np.int16) #全1
print np.empty((2,3))
print np.eye(3) #單位陣

#從字符串,函數,文件等創建
s ='abcdef'
print np.fromstring(s,dtype=np.int8)
print np.fromfunction(lambda i,j:(i+1)*(j+1), (9,9))
#fromfile從二進制文件中創建,tofile寫入文件

#從文件創建
np.savetxt('123.txt',a) #存為文本
e = np.loadtxt('123.txt')

#文件操作還有savez,save,load
np.save('c.npy', c) #存為二進制,后綴不可變
c = np.load('c.npy')
print c

np.savez('c.npz', c,d) #存儲多個數組
d = np.load('c.npz')
print d['arr_0'], d['arr_1']

c.tofile('c.bin')
c = np.fromfile('c.bin',dtype=np.int32) #讀出來是一維的
print c

#創建隨機數組
print np.random.random((2,3))

#結構體數組
persontype = np.dtype({'names':['name','age','weight'], 'formats':['S30','i','f']}, align=True)
f = np.array([('zhang',32,75.5), ('wang',24,65.2)], dtype=persontype)
print f
print f['name']
print f[0]['age']

 

屬性

# -*- coding: utf-8 -*-
import numpy as np

a = np.array([[1,2,3],[4,5,6]])

print a.ndim #維數
print a.shape #(3,2) 每個維數的長度
print a.size #元素個數
print a.dtype #float64,元素類型.所有類型可通過set(np.typeDict.values())查看
print a.itemsize #每個元素的字節數
print a.data #緩沖區地址

使用

# -*- coding: utf-8 -*-
import numpy as np

a = np.array([[1,2,3],[4,5,6]])

print a[1][2]
index = (1,2)
print a[index]
print a[0:2,1]
print a[:,[0,2]] #取第0和2列
print a[1]
print a[...,1]

for row in a:
    print row
for element in a.flat:
    print element

b = a>4
a[b] = 0
print a

操作

# -*- coding: utf-8 -*-
import numpy as np

a = np.array([[1,2,3],[4,5,6]])

#改變大小
a.ravel() #展平為1維數組
print a
a.shape = (3,2) #元素在內存中的位置並沒有改變
print a.reshape(2,-1) #a不動,返回改變形狀后的數組,-1對應的維自動計算
a.resize((2,3))
print a

#組合
b = np.floor(10*np.random.random((2,3)))
print np.vstack((a,b))
print np.hstack((a,b))
#類似還有concatenate, r_, c_

#分割
print np.hsplit(a,3)

#復制
c = a #c跟a完全相同
print c is a
c = a.view() #c跟a雖是不同數組,但c跟a公用數據.
c = a.copy() #深拷貝,c跟a完全不同
print a.repeat(3,axis=0)

a = np.array([1,2,3,4,5])
b = np.array([2,4,7])
ax,bx = np.ix_(a,b)
print ax.shape
print ax*bx

#產生能快速廣播的數組
x,y = np.ogrid[:1:4j, :1:3j] #和arange類似,三個產生是開始值,結束值,步長,步長為虛數表示長度
print x
print y
print 2*x + y
x,y = np.mgrid[:1:4j, :1:3j] #與ogrid不同的是,它返回的是廣播后的數組
print x
print y

 

運算

# -*- coding: utf-8 -*-
import numpy as np

a = np.array([[4,3],[2,1]])
b = np.array([[1,1],[0,1]])

#邏輯運算
print np.logical_or(a==b, a<b)
print np.any(a==b)
print np.all(a>b)

#對每個元素操作
print a<3
print a**2
print a*b
a *= 3
np.add(a,b,a)
print a

#通用函數
print np.exp(a)
print np.sort(a) #對每行排序
'''
當使用ufunc函數對兩個數組進行計算時,ufunc函數會對這兩個數組的對應元素進行計算,因此它要求這兩個數組的形狀相同。如果形狀不同,會進行如下的廣播(broadcasting)處理:
1. 讓所有輸入數組都向其中維數最多的數組看齊,shape屬性中不足的部分都通過在前面加1補齊。
2. 輸出數組的shape屬性是輸入數組的shape屬性的各個軸上的最大值。
3. 如果輸入數組的某個軸的長度為1或與輸出數組的對應軸的長度相同時,這個數組能夠用來計算,否則出錯。
4. 當輸入數組的某個軸的長度為1時,沿着此軸運算時都用此軸上的第一組值。
'''
#將a視為1維數組
print a.max() #a.func()等同於np.func(a)
print a.argmin()
print a.sum()
#以下4個為統計函數
print a.mean()
print a.var()
print a.std()
print np.cov(a)
#也可以對指定的維操作,例如
print a.sum(axis=0)
print np.add.reduce(a,axis=1)
print np.add.accumulate(a,axis=1) #於reduce不同的是它保留中間結果

print np.inner(a,a) #計算兩個數組最后1維的內積
print np.multiply.outer([1,2,3,4,5],[2,3,4]) #先使第一個參數的shape變為(5,1),再multiply,再執行squeeze剔除長度為1的軸

 

線性代數

# -*- coding: utf-8 -*-
import numpy as np
import numpy.matlib

a = np.array([[1.,2.],[3.,4.]])
b = np.array([[1,1],[0,1]])

print a.transpose()
print np.trace(a)
print a.trace()
print np.linalg.det(a)
print np.linalg.eig(a) #特征向量和特征值
print np.dot(a,b) #矩陣乘法
#解方程組
y = np.array([[5.],[7,]])
print np.linalg.solve(a,y)
#linalg更多函數見http://docs.scipy.org/doc/numpy/reference/routines.linalg.html

#矩陣類繼承自2維數組
A = np.mat(a)
print A.T
print A.I
X = np.matrix('5 6; 7 8').T
print A*X
print A[:,1] #跟數組不一樣,這里切片的結果還是矩陣
print numpy.matlib.identity(3,dtype=int) #單位陣

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM