gpt4 book ai didi

python - 为什么当我尝试对这个 numpy 数组求和时 Python 会崩溃?

转载 作者:太空狗 更新时间:2023-10-30 00:10:36 25 4
gpt4 key购买 nike

我正在使用 Python 3.4(Numpy 1.9.2 和 PIL.Image 1.1.7)开发 Ubuntu 14.04。这是我的做法:

>>> from PIL import Image
>>> import numpy as np

>>> img = Image.open("./tifs/18015.pdf_001.tif")
>>> arr = np.asarray(img)
>>> np.shape(arr)
(5847, 4133)

>>> arr.dtype
dtype('bool')

# all of the following four cases where I incrementally increase
# the number of rows to 700 are done instantly
>>> v = arr[1:100,1:100].sum(axis=0)
>>> v = arr[1:500,1:100].sum(axis=0)
>>> v = arr[1:600,1:100].sum(axis=0)
>>> v = arr[1:700,1:100].sum(axis=0)

# but suddenly this line makes Python crash
>>> v = arr[1:800,1:100].sum(axis=0)

fish: Job 1, “python3” terminated by signal SIGSEGV (Address boundary error)

在我看来,Python 突然耗尽了内存。如果是这样——我怎样才能为 Python 分配更多内存?正如我从 htop 中看到的那样,我的 32GB 内存容量甚至还没有完全耗尽。

您可以下载 TIFF 图像 here .


如果我创建一个空的 bool 数组,明确设置像素然后应用求和 - 那么它就可以工作:

>>> arr = np.empty((h,w), dtype=bool)
>>> arr.setflags(write=True)

>>> for r in range(h):
>>> for c in range(w):
>>> arr.itemset((r,c), img.getpixel((c,r)))

>>> v=arr.sum(axis=0)

>>> v.mean()
5726.8618436970719

>>> arr.shape
(5847, 4133)

但是这种“变通方法”并不是很令人满意,因为复制每个像素所花费的时间太长 - 也许有更快的方法?

最佳答案

我可以使用从 Ubuntu 存储库安装的 numpy v1.8.2/PIL v1.1.7 重现您的段错误。

  • 如果我使用 pip 在 vi​​rtualenv 中安装 numpy 1.8.2(仍然使用来自 Ubuntu 存储库的 PIL v1.7.1),那么我将不再看到段错误。

  • 如果我做相反的事情(使用 pip 安装 PIL v1.1.7,并使用 Ubuntu 存储库中的 numpy v1.8.2),我仍然会遇到段错误。

这让我相信它是由 numpy 中的一个旧错误引起的。我无法在 numpy 的问题跟踪器中找到合适的候选人,但我怀疑更新 numpy(例如从当前源或通过 pip)可能会解决问题。

一种解决方法是在创建数组之前将图像模式转换为 "P"(无符号 8 位整数),然后将其转换回 bool 值:

arr2 = np.asarray(img.convert("P")).astype(np.bool)
v = arr2[1:800,1:100].sum(axis=0)

关于python - 为什么当我尝试对这个 numpy 数组求和时 Python 会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29106338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com