2014-10-06 77 views
2

我移植一些代碼從r到蟒蛇開始(注:R中列出在第1,第0不元素開始),而是不斷變化的每一個地方我訪問數組我想創建一個子類numpy.array的,這樣,例如,下面的代碼蟒蛇:改變numpy.array訪問方法在1而不是0

import numpy 
    class array_starting_at_one(numpy.array): 
     ??? 
    def myfunc(A): 
     print A[1,1,1] 
     print A[1:3,1,:] 
    A = array_starting_at_one([[[1, 2, 3], [4, 5, 6]], [[11, 12, 13], [14, 15, 16]]]) 
    myfunc(A) 

輸出

1 
    [[ 1 2 3] 
    [11 12 13]] 

任何人都知道如何在填寫???在上面的代碼?

+2

您可以在子類中覆蓋['__getitem__'](https://docs.python.org/2/reference/datamodel.html#object.__getitem__) – slezica 2014-10-06 18:42:12

+4

您可以這樣做,但我會建議您不要。 1)它可能會涉及更多的視圖投射比你想要的。 2)從長遠來看,它很可能會比只是想保持兩種語言的索引約定直接在您的HEA更加混亂 - 特別是如果你打算與其他的工作誰使用NumPy的頻繁。 (請注意,我來自一個Fortran背景,其中指數從1開始爲好,很短的時間量之後,分歧沒什麼大不了的......) – mgilson 2014-10-06 18:42:22

+0

附:我知道ř解釋1:3作爲[1,2,3]代替[1,2](如蟒一樣),但我,衝前方稍微愚蠢,已經轉換的所有這些範圍的苦心方式。 – AndyP 2014-10-06 18:51:15

回答

0

這是我想出瞭解決方案:

import numpy 
def adj(attr): 
    if attr==None: 
     return attr 
    else: 
     return attr-1 
def adjust_slice(x): 
    if isinstance(x,int): 
     return x-1 
    elif isinstance(x,slice): 
     return slice(*[adj(attrib) for attrib in (x.start,x.stop,x.step)]) 
    elif isinstance(x,list): 
     return slice(x[0]-1,x[-1]-1,1) 
    else: 
     raise Exception("Expected slice, list, or int.") 
class array_starting_at_one(list): 
    def __init__(self,np_array): 
     self.np_array = numpy.array(np_array) 
    def __getitem__(self,i): 
     if isinstance(i,int): 
      i=i-1 
     elif isinstance(i,tuple): 
      i = tuple([adjust_slice(x) for x in i]) 
     else: 
      return array_starting_at_one(self.np_array[adjust_slice(x)]) 
     return self.np_array[i] 
    def __setitem__(self,i,y): 
     if isinstance(i,int): 
      self.np_array[i-1] = y 
     elif isinstance(i,tuple): 
      self.np_array[tuple([adjust_slice(x) for x in i])] = y 
     else: 
      self.np_array[adjust_slice(x)] = y 
    def __getslice__(self,i,j): 
     return array_starting_at_one(self.np_array[(i-1):(j-1)]) 
    def __setslice__(self,i,j,y): 
     self.np_array[i-1:j-1]=y 
    def __repr__(self): 
     print self.np_array 
    def __str__(self): 
     return str(self.np_array) 

它的工作爲我需要它,但我沒有太仔細測試,所以請謹慎使用時間。