简介
创建数组有 5 种常规机制:
从其他 Python 结构(如列表,元组)转换
NumPy 原生数组的创建(如 arange、ones、zeros等)
从磁盘读取数组,标准格式还是自定义格式
通过使用字符串或缓冲区从原始字节创建数组
使用特殊库函数(如 random)
将 Python array_like 对象转换为 Numpy 数组
通常,在 Python 中排列成 array-like 结构的数值数据可以通过使用 array() 函数转换为数组。如:
>>> 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内置了从头开始创建数组的函数:
zeros(shape) 将创建一个用指定形状用 0 填充的数组。默认的 dtype 是 float64。
>>> np.zeros((2, 3)) array([[ 0., 0., 0.], [ 0., 0., 0.]])
ones(shape) 将创建一个用 1 填充的数组。它在所有其他方面与zeros相同。
arange() 将创建具有有规律递增值的数组。
>>> np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.arange(2, 10, dtype=np.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])
linspace() 将创建具有指定数量元素的数组,并在指定的开始值和结束值之间平均间隔。
>>> np.linspace(1., 4., 6)
array([ 1. , 1.6, 2.2, 2.8, 3.4, 4. ])
这个创建函数的优点是可以保证元素的数量以及开始和结束点,对于任意的开始,停止和步骤值,arange()通常不会这样做。
indices() 将创建一组数组(堆积为一个更高维的数组),每个维度一个,每个维度表示该维度中的变化。这对于评估常规网格上多个维度的功能特别有用。
>>> 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 数组。
HDF5: h5py FITS: Astropy
无法直接读取但不易转换的格式示例是像 PIL 这样的库支持的格式(能够读取和写入许多图像格式,如 jpg,png 等)。
常见ASCII格式
逗号分隔值文件(CSV)被广泛使用(以及 Excel 等程序的导出和导入选项)。python 中有 CSV 函数和 pylab 函数(matplotlib 的一部分)。
更多通用的 ascii 文件可以在 scipy 中使用 io 软件包读取。
自定义二进制格式
有各种各样的方法可以使用。如果文件具有相对简单的格式,那么可以编写一个简单的 I/O 库,并使用 numpy fromfile() 函数和 .tofile() 方法直接读取和写入 numpy 数组!如果存在一个读取数据的良好 C 或 C++ 库,可以使用各种技术来封装该库。
使用特殊库
有些库可用于生成特殊用途的数组,且无法列出所有的这些库。最常见的用途是随机利用许多数组生成函数,这些函数可以生成随机值数组,以及一些实用函数来生成特殊矩阵(例如对角线)。
参考资料:
1. NumPy 官方文档:https://numpy.org/devdocs/