【问题标题】:Expected 'Py_ssize_t' but got 'long'预期为“Py_ssize_t”但得到“长”
【发布时间】:2020-08-05 16:52:24
【问题描述】:

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

【问题讨论】:

  • 什么是boundaries?你能提供一个完整的代码示例吗?了解输入数组的类型很重要。

标签: python scikit-image superpixels


【解决方案1】:

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)。同样,确切的答案取决于您的操作系统和 Python 版本,但如果我没记错的话,np.intp 应该是匹配Py_ssize_t 的正确类型。

【讨论】:

  • 感谢.astype(np.intp) 解决错误。我专注于 min_size 和 max_size 并且我没有考虑到错误是由第一个参数引起的
猜你喜欢
  • 1970-01-01
  • 2017-10-14
  • 2017-06-05
  • 1970-01-01
  • 2017-07-25
  • 2022-08-12
  • 1970-01-01
  • 2022-12-17
  • 2021-12-20
相关资源
最近更新 更多