数组接口是另一种与其他Python应用程序通信的机制。顾名思义,该协议机制只适用于类数组(array-like)对象。接下来还是使用PIL举例,但不涉及保存文件的操作。
准备工作
我们将复用上一攻略的部分代码,因此相关的准备工作也是类似的。这里省略了对上一攻略中的第一个步骤的介绍,假定你已知道怎样用图像数据创建数组。
具体步骤
让我们开始探索数组接口的用法。
- PIL图像的数组接口属性。
PIL图像对象有一个__array_interface__
属性。属性值是一个字典对象。让我们看一下它的内容。
array_interface = img.__array_interface__
print "Keys", array_interface.keys()
print "Shape", array_interface['shape']
print "Typestr", array_interface['typestr']
这段代码会打印如下信息。
Keys ['shape', 'data', 'typestr']
Shape (512, 512, 4)
Typestr |u1
- NumPy数组接口属性。
NumPy的ndarray模块也有一个__array_interface__
属性。可以使用asarray
函数把PIL图像转换为NumPy数组。
numpy_array = numpy.asarray(img)
print "Shape", numpy_array.shape
print "Data type", numpy_array.dtype
该数组的形状和数据类型是:
Shape (512, 512, 4)
Data type uint8
如你所见,数组的形状没有改变。本章的完整代码如下。
import numpy
import Image
import scipy.misc
lena = scipy.misc.lena()
data = numpy.zeros((lena.shape[0], lena.shape[1], 4), dtype=numpy.int8)
data[:,:,3] = lena.copy()
img = Image.frombuffer("RGBA", lena.shape, data)
array_interface = img.__array_interface__
print "Keys", array_interface.keys()
print "Shape", array_interface['shape']
print "Typestr", array_interface['typestr']
numpy_array = numpy.asarray(img)
print "Shape", numpy_array.shape
print "Data type", numpy_array.dtype
小结
数组接口(协议)使我们能够在Python的类数组对象之间共享数据。NumPy和PIL都提供了数组接口。