为什么这个PIL调用崩溃python?

为什么这个PIL调用崩溃python?,python,arrays,numpy,python-imaging-library,Python,Arrays,Numpy,Python Imaging Library,当我运行这个(Py2.7.1上的IPython 0.10.1)时,它似乎让python读取了一些它不应该读取的内存。有时会崩溃,有时不会,但我肯定可以通过将320x240零增加到(比如)3200x2400和/或调用blah.copy()使其崩溃。此外,如果我这样做: import Image from numpy import zeros, asarray YUV = zeros((240, 320, 3), dtype='uint8') im = Image.fromarray(YUV, mo

当我运行这个(Py2.7.1上的IPython 0.10.1)时,它似乎让python读取了一些它不应该读取的内存。有时会崩溃,有时不会,但我肯定可以通过将320x240零增加到(比如)3200x2400和/或调用blah.copy()使其崩溃。此外,如果我这样做:

import Image
from numpy import zeros, asarray
YUV = zeros((240, 320, 3), dtype='uint8')
im = Image.fromarray(YUV, mode="YCbCr")
blah = asarray(im)
我开始看到垃圾内存出现在第180行左右。这是怎么回事?我从PIL图像转换到numpy阵列的方式是否不好?使用array(im)而不是asarray(im)有什么区别?首选什么?(注意,在前一种情况下,它有时仍会崩溃,但似乎更稳定,垃圾更少)


(这里有一个)

我注意到您的图像是YCbCr 3频道,但您显示的是4频道。原来“垃圾数据”的问题是,解决方法是。PIL的阵列接口正在返回第四个通道


我在PIL 1.1.7下运行了您的测试用例,看到了噪音。我注释掉了
224
子批次,并使用重新运行测试,生成了一个正确的3通道阵列,没有噪音。崩溃也可能与此有关,但我无法在我的环境中重现它。

谢谢!通常,在转换为numpy数组时使用asarray(im)或array(im)是否正确。。或者甚至是asanyarray?这里有什么重要的区别吗?不客气!我所看到的示例都使用
numpy.asarray()
进行转换,但是其他变体应该根据需要工作。例如,
numpy.asfarray
将值强制转换为浮点数。
from matplotlib import pyplot as p
p.subplot(221); p.imshow(blah[:,:,0])
p.subplot(222); p.imshow(blah[:,:,1])
p.subplot(223); p.imshow(blah[:,:,2])
p.subplot(224); p.imshow(blah[:,:,3])
p.gray()
p.show()