【问题标题】:Cython: Buffer type mismatch, expected 'int' but got 'long'Cython:缓冲区类型不匹配,预期为“int”但得到“long”
【发布时间】:2015-08-28 03:39:56
【问题描述】:

我在将这个整数的内存视图传递给这个(相当微不足道的)函数时遇到了麻烦。 Python 给了我这个错误:

ValueError: Buffer dtype mismatch, expected 'int' but got 'long'

有人可以帮助我了解发生了什么吗?搜了一下stackoverflow,好像和python怎么解释类型,C怎么解释类型有关。

%%cython
def myfunction(int [:] y):
    pass

# Python code
import numpy as np
y = np.array([0, 0, 1, 1])
myfunction(y)

这会从上面生成ValueError

编辑:这是我发现的其他一些东西。

为了澄清,如果我通过以下方式声明y,此错误仍然存​​在:

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)

但是,如果我声明 y ,它会起作用

y = np.array([0, 0, 1, 1], dtype=np.int32)

有没有人想提出一个建议,为什么会这样?输入np.int32 会在不同的计算机上工作吗? (我使用的是 2013 年的 macbook pro Retina。)

【问题讨论】:

    标签: python numpy cython memoryview


    【解决方案1】:

    您正在使用 Cython 的 int 类型,即 C int。我认为在 Mac(或大多数架构)上它是 int 32 位的。见wikiintelDoes the size of an int depend on the compiler and/or processor?

    另一方面,long 表示 int64。 dtype='int'dtype=np.int 都等价于np.int64

    我认为您可能只是将其明确定义为 numpy 类型之一:

    cimport numpy as np
    import numpy as np
    cdef myfunction(np.ndarray[np.int64_t, ndim=1] y):
         #do something
         pass
    

    这样读起来更清晰,以后也不会混淆。

    编辑

    较新的memoryviews 语法如下:

    cdef myfunction(double[:] y):
        #do something with y
        pass
    

    【讨论】:

    • 感谢您的洞察力。在每台计算机上都可以使用np.int64_t 吗? (我知道我问过输入dtype=np.int32 是否适用于所有计算机,但这个选项在python 代码中。我想知道您上面提供的np.int64_t 选项是否适用于所有计算机,因为它是cython 代码。 )
    • 我想是的。因为它在函数声明中,只要我们传递一个np.int64 数组给它,它就可以了。内部np.int64_t 将如何转换为C 键入numpy 的问题,而不是我们的问题(我相信它已经被处理了,:P)。抱歉,这不是一个明确的答案,但我经常在教程和其他人的代码中看到这种用法。
    • 我相信 memoryview 语法现在比将其声明为 numpy 数组更受欢迎(它工作得更普遍,并且速度基本相同)。不过,关于np.int64 的观点是正确的。
    【解决方案2】:

    我按照错误消息告诉我的做了:我将memoryview 基本类型从int 更改为long,它似乎工作了。

    %%cython
    def fun(long[:] x):
        return x[0]
    
    y=np.array([1,2,3],dtype=int)
    fun(y)    # returns 1
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。受一博回答的启发,我使用了.astype(int),解决了这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-10
        • 2020-07-31
        • 2021-11-12
        • 2014-11-07
        • 2013-02-05
        • 2017-10-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多