2016-05-25 6 views
0

私は既にこのquestionを尋ねましたが、これを実装する方法をまだ理解できません。m [1:3、0:2] + = 1のようなサブマトリックスのためのインターフェイスを実装する方法は?

私は行列クラスを持っている:

class Matrix(list): 
    def __getitem__(self, item): 
     try: 
      return list.__getitem__(self, item) 
     except TypeError: 
      rows, cols = item 
      return [row[cols] for row in self[rows]] 

それはこのようなことを行うことができます:

m = Matrix([[i+j for j in [0,1,2,3]] for i in [0,4,8,12]]) 
print(m[0:2, 0:2]) 
will print: [[0, 1], [4, 5]] 

私も同じように、与えられた値を乗算/全ての部分行列の要素を追加できるようにしたいです:

m[0:2, 0:2] += 1 
print(m[0:2, 0:2]) 
should print: [[1, 2], [5, 6]] 

私はそれらのメソッドを実装しようとしています:211232、__add__を10

def __setitem__(self, key, value): 
    print(key, value) 

def __add__(self, item): 
    print(item) 
    for i in range(self): 
     for j in range(self[0]): 
      self[i][j] += item 

少なくとも、私は何かを印刷したいと思っています。しかし、それは起こりません。

m[1:2, 2:3] = m[1:2, 2:3] + 1 

をなどのエラーが表示されます。:私は、そのような例をしようとしているTypeError: can only concatenate list (not "int") to list

私は魔法の方法でさえもありません。前に呼び出しが失敗します。これを行う方法?

+0

からMatrixオブジェクトを返すことがありますか? – shx2

+0

@ shx2研究目的 –

答えて

1

あなたがnumpyのを再発明しているのはなぜ "のGetItem"

class Matrix(list): 
    def __getitem__(self, item): 
     print "get" 
     try: 
      return Matrix(list.__getitem__(self, item)) 
     except TypeError: 
      rows, cols = item 
      return Matrix([row[cols] for row in self[rows]]) 
    def __setitem__(self, key, value): 
     print(key, value) 

    def __add__(self, item): 
     print "messi the great" 
     print(item) 
     # for i in range(self): 
     #  for j in range(self[0]): 
     #   self[i][j] += item 
m = Matrix([[i+j for j in [0,1,2,3]] for i in [0,4,8,12]]) 
print m[1:2, 2:3] 
m[1:2, 2:3] = m[1:2, 2:3] + 1 
関連する問題