为什么要有 numpy
- 标准安装的
Python
中用列表(list)
保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。这样为了保存一个简单的[1,2,3]
,需要有3个指针
和三个整数对象
。对于数值运算来说这种结构显然比较浪费内存和CPU计算时间。 - 此外
Python
还提供了一个array
模块,array
对象和列表不同,它直接保存数值,和C语言
的一维数组
比较类似。但是由于它不支持多维,也没有各种运算函数,因此也不适合做数值运算。 NumPy
的诞生弥补了这些不足,NumPy
提供了两种基本的对象:ndarray
(N-dimensional array object)和ufunc
(universal function object)。ndarray
(下文统一称之为数组)是存储单一数据类型的多维数组,而ufunc
则是能够对数组进行处理的函数。
ndarray 简单的内存描述
ndarray
中的每个元素是数据类型对象的对象(称为 dtype
),并在内存中使用相同大小和区域连续的块。带有将每个元素映射到内存块中某个位置的索引方案。 内存块以按行(C 风格
)或按列(FORTRAN
或MatLab
风格)的方式保存元素。
从ndarray
对象提取的任何元素(通过切片)由一个数组标量类型的 Python 对象表示。 下图显示了ndarray
,数据类型对象(dtype
)和数组标量类型之间的关系。
基本的ndarray
是使用 NumPy 中的数组函数创建的,如下所示:
numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
它从任何暴露数组接口的对象,或从返回数组的任何方法创建一个ndarray。
上面的构造器接受以下参数:
参数 | 描述 |
---|---|
object | 任何暴露数组接口方法的对象都会返回一个数组或任何(嵌套)序列。 |
dtype | 数组的所需数据类型,可选。 |
copy | 可选,默认为true ,对象是否被复制。 |
order | C (按行)、F (按列)或A (任意,默认)。 |
subok | 默认情况下,返回的数组被强制为基类数组。 如果为true ,则返回子类。 |
ndmin | 指定返回数组的最小维数。 |
看看下面的例子来更好地理解。
示例
>>> import numpy as np
>>> alist = list(range(4))
>>> andarray = np.array(alist)
>>> andarray
array([0, 1, 2, 3])
>>> alist = [[1, 2], [3, 4]]
>>> andarray = np.array(alist)
>>> andarray
array([[1, 2],
[3, 4]])
>>> alist = list(range(4))
>>> andarray = np.array(alist, ndmin=2)
>>> andarray
array([[0, 1, 2, 3]])
>>> andarray = np.array(alist, dtype=np.complex)
>>> andarray
array([0.+0.j, 1.+0.j, 2.+0.j, 3.+0.j])