Tôi gặp sự cố khi chuyển qua bộ nhớ này về các số nguyên vào hàm này (khá nhỏ). Python đang cung cấp cho tôi lỗi này:Cython: Loại bộ đệm không khớp, được mong đợi là 'int' nhưng có 'dài'
ValueError: Buffer dtype mismatch, expected 'int' but got 'long'
Ai đó có thể giúp tôi hiểu điều gì đang xảy ra không? Tìm kiếm xung quanh stackoverflow, có vẻ như nó đã làm với cách python diễn giải các loại, và cách C diễn giải các loại.
%%cython
def myfunction(int [:] y):
pass
# Python code
import numpy as np
y = np.array([0, 0, 1, 1])
myfunction(y)
Điều này tạo ra ValueError
từ trên cao.
EDIT: Dưới đây là một số điều khác tôi đã khám phá.
Để làm rõ, lỗi này vẫn tồn nếu tôi tuyên bố y
các cách sau:
y = np.array([0, 0, 1, 1], dtype='int')
y = np.array([0, 0, 1, 1], dtype=np.int)
y = np.array([0, 0, 1, 1], dtype=np.int64)
Tuy nhiên, nó hoạt động nếu tôi tuyên bố y
với
y = np.array([0, 0, 1, 1], dtype=np.int32)
Có ai muốn đưa ra một gợi ý tại sao điều này là trường hợp? Việc ném vào np.int32
có hoạt động trên các máy tính khác nhau không? (Tôi sử dụng macbook pro retina, 2013.)
Cảm ơn thông tin chi tiết. Việc ném vào 'np.int64_t' có hoạt động trên mọi máy tính không? (Tôi biết rằng tôi đã hỏi liệu việc ném vào 'dtype = np.int32' có hoạt động trên tất cả các máy tính hay không, nhưng tùy chọn này nằm trong mã python. Tôi tự hỏi liệu tùy chọn' np.int64_t' bạn đã cung cấp ở trên có hoạt động trên tất cả các máy tính hay không , cho nó là mã cython.) – hlin117
Tôi nghĩ vậy. Bởi vì nó nằm trong khai báo hàm, miễn là chúng ta chuyển mảng 'np.int64' vào nó, nó sẽ làm tốt. Cách thức nội bộ 'np.int64_t' sẽ được dịch thành 'C', gõ vào nó' numpy', không phải vấn đề của chúng ta (và tôi tin rằng nó đã được xử lý,: P). Xin lỗi đây không phải là câu trả lời dứt khoát, nhưng tôi đã thấy việc sử dụng này trong hướng dẫn và mã của người khác khá thường xuyên. –
Tôi tin rằng cú pháp memoryview bây giờ được ưa thích để tuyên bố nó như là một mảng numpy (nó hoạt động nhiều hơn nói chung, và ở tốc độ cơ bản tương tự). Tuy nhiên, điểm về 'np.int64' là đúng. – DavidW