数组创建

介绍

创建数组的一般机制有5种:

  1. 从其他Python结构(如列表、元组)转换

  2. 内部numpy数组创建对象(例如,arange、one、zero等)

  3. 从磁盘读取阵列,可以是标准格式,也可以是自定义格式

  4. 通过使用字符串或缓冲区从原始字节创建数组

  5. 特殊库功能的使用(如随机)

本节将不介绍复制、连接或以其他方式扩展或改变现有阵列的方法。它也不包括创建对象数组或结构化数组。这两个部分都包含在各自的章节中。

将类似python数组的对象转换为numpy数组

通常,在python中,以类似数组的结构排列的数字数据可以通过使用array()函数转换为数组。最明显的例子是列表和元组。有关其使用的详细信息,请参阅array()的文档。有些对象可能支持数组协议,并允许以这种方式转换到数组。使用array()来确定对象是否可以转换为numpy数组的一个简单方法就是交互地尝试它,看看它是否有效!( Python 的方式)。

例子::

>>> x = np.array([2,3,1,0])
>>> x = np.array([2, 3, 1, 0])
>>> x = np.array([[1,2.0],[0,0],(1+1j,3.)]) # note mix of tuple and lists,
    and types
>>> x = np.array([[ 1.+0.j, 2.+0.j], [ 0.+0.j, 0.+0.j], [ 1.+1.j, 3.+0.j]])

内部numpy数组创建

numpy有内置的函数,可以从头创建数组:

零(形状)将创建一个用指定形状填充0值的数组。默认的数据类型是float64。::

>>> np.zeros((2, 3))
array([[ 0., 0., 0.], [ 0., 0., 0.]])

一个(形状)将创建一个由1个值填充的数组。它在所有其他方面都与零相同。

arange()将创建具有规则递增值的数组。请检查docstring以获取有关其各种使用方法的完整信息。这里将给出几个例子::

>>> np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.arange(2, 10, dtype=float)
array([ 2., 3., 4., 5., 6., 7., 8., 9.])
>>> np.arange(2, 3, 0.1)
array([ 2. , 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9])

注意,对于用户应该知道的最后一次使用,有一些微妙的地方在arange docstring中描述。

linspace()将创建具有指定数量元素的数组,并在指定的开始值和结束值之间等距分布。例如:

>>> np.linspace(1., 4., 6)
array([ 1. ,  1.6,  2.2,  2.8,  3.4,  4. ])

这个创建函数的优点是可以保证元素的数量以及开始和结束点,而arange()通常不会对任意的开始、停止和步骤值执行此操作。

indexs()将创建一组数组(堆叠为一个更高维度的数组),每个维度一个数组,每个数组表示该维度中的变量。一个例子说明了比口头描述好得多:::

>>> np.indices((3,3))
array([[[0, 0, 0], [1, 1, 1], [2, 2, 2]], [[0, 1, 2], [0, 1, 2], [0, 1, 2]]])

这对于在规则网格上评估多个维度的函数特别有用。

从磁盘读取阵列

这可能是创建大型数组最常见的情况。当然,细节在很大程度上取决于磁盘上数据的格式,因此本节只能给出如何处理各种格式的一般性指针。

标准二进制格式

各种字段都有数组数据的标准格式。下面列出了具有已知的python库来读取它们并返回numpy数组的那些库(可能还有其他库可以读取并转换为numpy数组,因此请检查最后一节)::

HDF5: h5py
FITS: Astropy

不能直接读取但不难转换的格式示例是PIL等库支持的格式(能够读取和写入许多图像格式,如JPG、PNG等)。

通用ASCII格式

逗号分隔值文件(comma-separated value files,csv)被广泛使用(也是Excel等程序的导出和导入选项)。在python中有许多方法可以读取这些文件。python中有csv函数,pylab中有函数(matplotlib的一部分)。

使用scipy中的IO包可以读取更多通用的ASCII文件。

自定义二进制格式

我们可以使用多种方法。如果文件的格式相对简单,那么可以编写一个简单的I/O库,并使用numpy fromfile()函数和.to file()方法直接读取和写入numpy数组(注意字节顺序!)如果一个好的C或C++库存在读取数据,则可以用多种技术来封装该库,尽管这肯定是更为有用的工作,并且需要更高级的知识来与C或C++接口。

特殊类库的使用

有些库可用于生成特殊用途的数组,因此无法枚举所有这些库。最常见的用途是使用可以生成随机值数组的多个随机数组生成函数,以及一些用于生成特殊矩阵(例如对角线)的实用函数。