用Python2 7實現矩陣類

2021-08-19 08:51:11 字數 4349 閱讀 9030

import copy

class matrix:

'''matrix class'''

def __init__(self, row, column, fill =0):

self.shape = (row, column)

self.row = row

self.column = column

if isinstance(fill,float) or isinstance(fill,int):

self._matrix = [[fill]*column for i in range(row)]

elif isinstance(fill,list):

self._matrix = fill

# 返回元素m(i,j)的值:m[i,j]

def __getitem__(self,index):

if isinstance(index,int):

return self._matrix[index]

elif isinstance(index,tuple):

return self._matrix[index[0]][index[1]]

#設定元素m(i,j)的值為s:m[i,j] = s

def __setitem__(self,index,value):

if isinstance(index,int):

self._matrix[index] = copy.deepcopy(value)

elif isinstance(index,tuple):

self._matrix[index[0]][index[1]] = value

def __eq__(self,n):

assert isinstance(n,matrix), "型別不匹配,不能比較"

return n.shape == self.shape

def __add__(self,n):

assert n.shape == self.shape, "維度不匹配,不能相加"

m = matrix(self.row,self.column)

for r in range(self.row):

for c in range(self.column):

m[r,c] = self[r,c]+n[r,c]

return m

def __sub__(self,n):

assert n.shape == self.shape, "維度不匹配,不能相減"

m = matrix(self.row,self.column)

for r in range(self.row):

for c in range(self.column):

m[r,c] = self[r,c]-n[r,c]

return m

def __mul__(self,n):

if isinstance(n,int) or isinstance(n,float):

m = matrix(self.row,self.column)

for r in range(self.row):

for c in range(self.column):

m[r,c] = self[r,c]*n

else:

assert n.row == self.column, "維度不匹配,不能相乘"

m = matrix(self.row,n.column)

for r in range(self.row):

for c in range(n.column):

sum = 0

for k in range(self.column):

sum +=self[r,k]*n[k,c]

m[r,c] = sum

return m

def __pow__(self,k):

assert self.row == self.column,"不是方陣,不能乘方"

m = copy.deepcopy(self)

for i in range(k):

m = m*self

return m

#矩陣轉置

def transpose(self):

m = matrix(self.column,self.row)

for r in range(self.row):

for c in range(self.column):

m[c,r] = self[r,c]

return m  

#逆矩陣

def invert(self):

assert self.row == self.column,"不是方陣"

m = matrix(self.row,self.column*2)

i = identity(self.row)

#i.show()

#原有矩陣拼接乙個單位矩陣

for r in range(m.row):

temp = self[r]

temp.extend(i[r])

m[r] = copy.deepcopy(temp)

# m.show()

#初等行變換

for r in range(m.row):

# 本行首元素(m[r, r])若為 0,則向下交換最近的當前列元素非零的行

if m[r,r] == 0:

for rr in range(r+1,m.row):

if m[rr,r] != 0:

m[r],m[rr] = m[rr],m[r] #交換兩行

break

assert m[r,r] != 0,"矩陣不可逆"

# 本行首元素化為1

temp = m[r,r]

for c in range(r,m.column):

m[r,c] /=temp

# m.show()

# 本列上、下方所有元素的處理

for rr in range(m.row):

temp = m[rr,r]

for c in range(m.column):

if rr == r:

continue

m[rr,c] -=temp*m[r,c]

# m.show()

#擷取逆矩陣

n = matrix(self.row,self.column)

for r in range(self.row):

n[r] = m[r][self.row:]

return n

def show(self):

for r in range(self.row):

for c in range(self.column):

print self[r,c] + ' '

print ''   

#生成單位矩陣

def identity(num):

m = matrix(num,num)

for r in range(num):

for c in range(num):

m[r,c] = 1 if r==c else 0

return m  

#將陣列轉換為矩陣

def mat(arr):

assert isinstance(arr,list),"引數不是陣列,不能轉換"

if isinstance(arr[0],list):

row = len(arr)

column = len(arr[0])

return matrix(row,column,arr)

else:

row = 1

column = len(arr)

m = matrix(row,column,0)

for r in range(m.row):

for c in range(m.column):

m[r,c] = arr[c]

return m

#計算矩陣的行列式(m為二維陣列)

def det(m):

if len(m) <= 0:

return none

elif len(m) == 1:

return m[0][0]

else:

s = 0

for i in range(len(m)):

# 這裡生成余子式

n = [[row[a] for a in range(len(m)) if a != i] for row in m[1:]]

s += m[0][i] * det(n) * (-1) ** (i % 2)

return s

python2 7換行 Python2 7基礎語法

1.建立檔案xx.py usr bin python3 print hello,world 2.linux下執行 python hello.py 3.編碼 預設字串unicode 設定編碼 coding utf 8 4.識別符號 第乙個字元必須是字母表中字母或下劃線 識別符號的其他的部分有字母 數字...

python2 7是什麼 python2 7是什麼

pyton2.7是python在2010年發布的乙個版本。python 是乙個高層次的結合了解釋性 編譯性 互動性和物件導向的指令碼語言,具有很強的可讀性,相比其他語言經常使用英文關鍵字,其他語言的一些標點符號,它具有比其他語言更有特色語法結構。下面來解釋一下python這門語言 python是一種...

python2 7中文編碼 python2 7

我從外部api中獲得了乙個字串 u4ece u8d77 u70b9 u5411 u6b63 u5357 u65b9 u5411 u51fa u53d1,u884c u9a76170 u7c73,u76f4 u884c u8fdb u5165 u4e2d u5173 u6751 u4e1c u8def...