2017-08-04 1 views
0

Je suis débutant et je suis sûr que cette question est trop simple. J'essaye de tester des vues de mémoire dans Cython pour apprendre à les connaître beaucoup mieux. Dans mon code je passe chaque élément de vue de mémoire (comme [1,2]) comme l'élément cy de classe move.Comment accéder à l'élément de vue de type typé-mémoire d'une classe déclarée dans 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) 

Lorsque j'imprime les résultats. Je reçois ceci:

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

J'ai besoin cy imprime classe une liste. Comment puis-je le réparer? il y a un autre problème qui se produit à moi quand j'utilise ce code:

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) 

Après l'exécution de ce code, je reçois toujours cette erreur:
TypeError: a bytes-like object is required, not 'int'. Quelle est la cause de cette erreur et comment puis-je réparer celle-ci?

Répondre

1

Votre premier problème est simplement qu'une fonction memoryview n'a pas de fonction utile à utiliser pour l'impression. Vous pouvez le convertir en un objet qui ne imprime bien

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

Ou vous pouvez itérer vous-même:

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() 

Votre deuxième problème est plus difficile à résoudre puisque vous ne dites pas nous quelle ligne l'erreur vient. Je pense que c'est le constructeur de cy qui attend un memoryview mais vous passez un entier à. (Je reçois un message d'erreur légèrement différent cependant).

+0

merci. J'ai corrigé l'erreur. –