【问题标题】:scikit-image transform ValueError: Buffer not C contiguousscikit-image 转换 ValueError:缓冲区不是 C 连续的
【发布时间】:2015-01-01 14:52:25
【问题描述】:

我正在使用 skimage 转换模块的 resize 方法。

并非总是如此,但有时,我在这一行遇到错误:

candidate = resize(np.copy(img[candidate_box[0]:candidate_box[2],candidate_box[1]:candidate_box[3]]), (50,100))

它告诉我:

ValueError: Buffer not C contiguous

我该如何解决这个问题?

【问题讨论】:

  • 您能否提供一个自包含的 sn-p 来显示此行为?那不应该发生,如果发生了,那是我想修复的错误。调整非连续数组的大小适用于我的系统。

标签: python numpy buffer scikit-image


【解决方案1】:

重塑(和其他操作)有时会破坏数组的连续性。您可以通过查看flags 来检查是否发生这种情况:

>>> a = np.arange(10).reshape(5, 2).T
>>> a.flags
  C_CONTIGUOUS : False # reshaped array is no longer C contiguous
  F_CONTIGUOUS : True
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False

尝试使用 np.ascontiguousarray 制作数组的 C 连续副本:

 >>> b = np.ascontiguousarray(a)
 >>> b.flags
  C_CONTIGUOUS : True # array b is a C contiguous copy of array a
  F_CONTIGUOUS : False
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False

该函数返回一个与目标数组具有相同形状和值的数组,但返回的数组存储为 C 连续数组。

【讨论】:

  • 你建议我在哪里添加 ascontiguousarray 部分?我正在尝试这样:candidate = resize(np.ascontiguousarray(img[candidate_box[0]:candidate_box[2],candidate_box[1]:candidate_box[3]]), (50,100))
  • @user961627 是的,如果resize 要求数组是 C 连续的,那似乎是一个使用它的好地方。
【解决方案2】:

我发现一个错误可能会引发此异常。确保您的区域您的图片中。例如,假设您的图像是 300x200,您的区域是 [199:299, 100:199]。注释 299>200。如果你执行 resize(image[100:199, 199:299]),你会看到这个错误。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    相关资源
    最近更新 更多