2017-08-04 26 views
0

我是一名初學者,我相信這個問題太簡單了。我試圖在cython中測試內存視圖以更好地瞭解它們。在我的代碼中,我將每個內存視圖元素(如[1,2])作爲cy類元素move傳遞。如何訪問在cython中聲明的類的類型化內存視圖元素?

cdef class cy: 
    cdef public long[:] move 
    def __init__(self, move): 
     self.move = move 
lst = [] 
for i in range(100): 
    lst.append([i, i+1]) 

cdef long[:, :] memview = np.asarray(lst) 

b0 = cy(memview[0]) 
print(b0.move) 

當我打印結果。我得到這個:

<MemoryView of 'ndarray' object> # I expect for sth like [12, 13] 

我需要cy類打印出一個列表。我該如何解決它? 有,當我使用此代碼,發生在我的另一個問題:

cdef class parent: 
    cdef public: 
     list children 
     list moves 
    def __init__(self): 
     self.children = [] 
    def add_children(self, moves): 
     cdef int i = 0 
     cdef int N = len(moves) 
     for i in range(N): 
      self.children.append(cy(moves[i])) 

cdef int[:, :] moves = np.asarray(lst, dtype=np.int32) 
obj = parent() 

for move in moves: 
    obj.add_children(move) 

運行此代碼後,我總是得到這個錯誤:
TypeError: a bytes-like object is required, not 'int'。 是什麼導致了這個錯誤,我該如何解決這個問題?

回答

1

你的第一個問題是,一個memoryview沒有一個有用的__str__函數供打印使用。您可以將其轉換爲一個對象,它可以打印精美的

print(list(b0.moves)) 
print(np.asarray(b0.moves)) 

或者,您可以通過它自己的迭代:

for i in range(b0.moves.shape[0]): 
    print(b0.moves[i], end=' ') # need to have Cython set to use Python 3 syntax for this line 
print() 

你的第二個問題是很難解決,因爲你不知道我們錯誤來自哪裏。我認爲這是cy的構造函數,它需要一個內存視圖,但你傳遞一個整數。 (雖然我收到了一些不同的錯誤信息)。

+0

謝謝。我修正了錯誤。 –

相關問題