如何访问在cython中声明的类的类型化内存视图元素?

时间:2017-08-04 17:45:23

标签: cython python-3.5 typed-memory-views

我是初学者,我相信这个问题太简单了。我试图在cython中测试内存视图以更好地了解它们。在我的代码中,我将每个内存视图元素(如int led = 5; int button = 3; void setup() { Serial.begin(9600); pinMode(button, INPUT_PULLUP); pinMode(led, OUTPUT); digitalWrite(led, LOW); } void loop() { if (digitalRead(button) == LOW) { Serial.print("pressed\n"); toggleLed(led); } } int toggleLed(int led){ if (digitalRead(led) == LOW) { Serial.print("set on"); digitalWrite(led, HIGH); } else { Serial.print("set off"); digitalWrite(led, LOW); } } )作为[1,2]类元素cy传递。< / p>

move

当我打印结果时。我明白了:

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) 。 导致此错误的原因是什么?如何修复此错误?

1 个答案:

答案 0 :(得分:1)

你的第一个问题就是内存视图没有一个有用的__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的构造函数,它需要一个内存视图但是你传递一个整数。 (虽然我得到了一个略有不同的错误信息。)