2017-08-04 25 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

谢谢。我修正了错误。 –

相关问题