预期 'Py_ssize_t' 但得到 'long'

Expected 'Py_ssize_t' but got 'long'

我正在为图像分割重新实现 SLIC 只是为了好玩。但是我很懒惰,我不想编写一个函数来连接所有集群,所以我决定使用 skimage 中的 _enforce_label_connectivity_cython() 但我收到 Buffer dtype mismatch 错误,我现在不知道如何解决它

np.expand_dims(boundaries, axis=0)的数据类型,即数组内部元素的类型,不是Cython函数所期望的。它需要 Py_ssize_t,这是一种取决于您的平台的类型,但它正在获取类型 long 的数组,这意味着 np.int64。要获得正确的类型,我认为你可以这样做:

labels = _enforce_label_connectivity_cython(
    np.expand_dims(boundaries, axis=0).astype(np.intp),
    min_size,
    max_size,
)

如果这不起作用,请尝试 .astype(np.int32)。同样,确切的答案取决于您的 OS 和 Python 版本,但如果我没记错的话,np.intp 应该是匹配 Py_ssize_t.

的正确类型