Python和数据结构学习 --- 1

今天就到了二维的了.Python中默认是没有带二维的数据结构的.二维的数据结构可以通过一维的数据组成.代码如下

class Array2D:
    def __init__(self,numRows,numCols):
        self._theRows = Array(numRows)
        for i in range(numRows):
            self._theRows[i] = Array(numCols)
            
    def numRows(self):
        return len(self._theRows)
        
    def numCols(self):
        return len(self._theRows[0])
        
    def clear(self,value):
        for r in range(self.numRows()):
            self._theRows[r].clear(value)
            
    def __getitem__(self,ndxTuple):
        assert len(ndxTuple) == 2,"Invalid number of array subscripts"
        row = ndxTuple[0]
        col = ndxTuple[1]
        assert row >= 0 and row <self.numRows()\
            and col >= 0 and col < self.numCols(),\
                "Array subscript out of range"
        the1dArray = self._theRows[row]
        return the1dArray[col]
        
    def __setitem__(self,ndxTuple,value):
        assert len(ndxTuple) == 2,"Invalid number of array subscripts"
        row = ndxTuple[0]
        col = ndxTuple[1]
        assert row >= 0 and row <self.numRows()\
            and col >= 0 and col < self.numCols(),\
                "Array subscript out of range"
        the1dArray = self._theRows[row]
        the1dArray[col] = value    

注意下调用形式,这里的是实现了 __getitem__ ,__setitem__,这里是这样调用的 如a = Array2D(2,3) a[1,2] = 5

当然也可以像c/c++那样,改写下__getitem__

def __getitem__(self,row):
    return self._thwRows[row]

这时调用就是这样子 val = a[1][2] 和a[1,2] = val,连__setitem__都不要写了.相当于2次函数调用.

说到二维数组自然想到矩阵(Matrix).

当然实际使用时是直接使用numpy庫拉.

实现代码如下,其实只是在Array2D上加了几个简单的操作而已.

from array import Array2D
class Matrix:
    def __init__(self,numRows,numCols):
        self._theGrid = Array2D(numRows,numCols)
        self._theGrid.clear(0)
        
    def numRows(self):
        return self._theGrid.numRows()
        
    def numCols(self):
        return self._theGrid.numCols()
        
    def __getitem__(self,ndxTuple):
        return self._theGrid[ndxTuple[0],ndxTuple[1]]
        
    def __setitem__(self,ndxTuple,scalar):
        self._theGrid[ndxTuple[0],ndxTuple[1]] = scalar
        
    def scaleBy(self,scalar):
        for r in range(self.numRows()):
            for c in range(self.numCols()):
                self[r,c] *= scalar
                
    def tranpose(self):
        newMatrix = Matrix(self.numCols(),self.numRows())
        for r in range(self.numRows()):
            for c in range(self.numCols()):
                newMatrix[c,r] = self._theGrid[r,c]
        
        return newMatrix
        
    def __add__(self,rhsMatrix):
        assert rhsMatrix.numRows() == self.numRows() and \
            rhsMatrix.numCols() == self.numCols(),\
            "Matrix sizes not compatible for the add operation"
        newMatrix = Matrix(self.numRows(),self.numCols())
        for r in range(self.numRows()):
            for c in range(self.numCols()):
                newMatrix[r,c] = self[r,c] + rhsMatrix[r,c]
        return newMatrix
        
    def __sub__(self,rhsMatrix):
        assert rhsMatrix.numRows() == self.numRows() and \
            rhsMatrix.numCols() == self.numCols(),\
            "Matrix sizes not compatible for the add operation"
        newMatrix = Matrix(self.numRows(),self.numCols())
        for r in range(self.numRows()):
            for c in range(self.numCols()):
                newMatrix[r,c] = self[r,c] - rhsMatrix[r,c]
        return newMatrix
    
    def __mul__(self,rhsMatrix):
        assert rhsMatrix.numRows() == self.numCols() ,\
            "Matrix sizes not compatible for the add operation"
        newR = self.numRows()
        newC = rhsMatrix.numCols()
        newK = self.numCols()
        newMatrix = Matrix(newR,newC)
        for r in range(newR):
            for c in range(newC):
                temp = 0
                for k in range(newK):
                    temp += self._theGrid[r,k]*rhsMatrix[k,c]
                newMatrix[r,c] = temp
        return newMatrix

测试也很简单.

嗯,好了睡觉...

 

 

 

posted @ 2012-11-29 00:14  zhuangzhuang1988  阅读(373)  评论(0编辑  收藏  举报