Numpy 使用数组接口

数组接口是另一种与其他Python应用程序通信的机制。顾名思义,该协议机制只适用于类数组(array-like)对象。接下来还是使用PIL举例,但不涉及保存文件的操作。

准备工作

我们将复用上一攻略的部分代码,因此相关的准备工作也是类似的。这里省略了对上一攻略中的第一个步骤的介绍,假定你已知道怎样用图像数据创建数组。

具体步骤

让我们开始探索数组接口的用法。

  1. 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

  1. 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都提供了数组接口。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程