`
wwweducn
  • 浏览: 29603 次
文章分类
社区版块
存档分类
最新评论

二维、调用-Python和数据结构学习 -by小雨

阅读更多

每日一贴,明天的内容关键字为二维、调用-

    明天就到了二维的了.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

测试也很简略.

    

    嗯,好了睡觉...

 

 

 

文章结束给大家分享下程序员的一些笑话语录: 一位程序员去海边游泳,由于水性不佳,游不回岸了,于是他挥着手臂,大声求.救:“F1,F1!”

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics