I'm having trouble passing in this memoryview of integers into this (rather trivial) function. Python is giving me this error:
ValueError: Buffer dtype mismatch, expected 'int' but got 'long'
Can someone help me understand what's going on? Searching around stackoverflow, it seems that it has to do with how python interprets types, and how C interprets types.
%%cython
def myfunction(int [:] y):
pass
# Python code
import numpy as np
y = np.array([0, 0, 1, 1])
myfunction(y)
This produces the ValueError
from above.
EDIT: Here are some other things I've discovered.
To clarify, this error persists if I declare y
the following ways:
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)
However, it works if I declare y
with
y = np.array([0, 0, 1, 1], dtype=np.int32)
Does anyone want to give a suggestion why this is the case? Would throwing in np.int32
work on different computers? (I use a macbook pro retina, 2013.)
You are using Cython's int
type, which is just C
int
. I think on Mac (or most architectures) it is int 32-bit. See wiki or intel or Does the size of an int depend on the compiler and/or processor?
On the other hand, long
means int64. dtype='int'
or dtype=np.int
are all equivalent to np.int64
.
I think you might just explicitly define it as one of the numpy
type:
cimport numpy as np
import numpy as np
cdef myfunction(np.ndarray[np.int64_t, ndim=1] y):
#do something
pass
That way it reads more clear and there will not be any confusion later.
EDIT
The newer memoryviews syntax would be like this:
cdef myfunction(double[:] y):
#do something with y
pass
I did what the error message told me: I changed the memoryview
base type from int
to long
and it seemed to work.
%%cython
def fun(long[:] x):
return x[0]
y=np.array([1,2,3],dtype=int)
fun(y) # returns 1
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With