向量、矩阵 & 多维数组是数值计算中必不可少的工具;通过对数组数据进行批量处理,避免了对数组元素显式地进行循环操作,这样做的结果是可以得到简洁、更易维护的代码,并且可以使用更底层的库来实现数组操作。因此,向量化计算相比按顺序逐元素进行计算要快得多。
在 Python科学计算环境中,Numpy 库提供了用于处理数组的高效数据结构,且Numpy的核心是使用C语言实现的,提供了很多处理和处理数组的函数。
NumPy支持比Python更多种类的数字类型,有5种基本数字类型:
布尔值(bool)整数(int)无符号整数(uint)浮点(float)复数(complex)Numpy库的核心是表示 同质的多维数据 —— 每个元素占用相同大小的内存块, 并且所有块都以完全相同的方式解释。 如何解释数组中的每个元素由单独的数据类型对象指定, 其中一个对象与每个数组相关联。除了基本类型(整数,浮点数 等 )之外, 数据类型对象还可以表示数据结构。
NumPy提供了一个N维数组类型,即ndarray, 它描述了相同类型的“项目”集合。可以使用例如N个整数来索引项目。从数组中提取的项( 例如 ,通过索引)由Python对象表示, 其类型是在NumPy中构建的数组标量类型之一。 数组标量允许容易地操纵更复杂的数据排列。
ndarray 与 array 的区别 np.array 只是一个便捷的函数,用来创建一个ndarray,它本身不是一个类。 ndarray 数组,是用 np.ndarray类的对象 表示n维数组对象 所以ndarray是一个类对象,而array是一个方法。
创建数组有5种常规机制:
从其他Python结构(例如,列表,元组)转换numpy原生数组的创建(例如,arange、ones、zeros等)从磁盘读取数组,无论是标准格式还是自定义格式通过使用字符串或缓冲区从原始字节创建数组使用特殊库函数(例如,random)一个 ndarray是具有相同类型和大小的项目的(通常是固定大小的)多维容器。 尺寸和数组中的项目的数量是由它的shape定义, 它是由N个非负整数组成的tuple(元组),用于指定每个维度的大小。 数组中项目的类型由单独的data-type object (dtype)指定, 其中一个与每个ndarray相关联。
与Python中的其他容器对象一样,可以通过对数组进行索引或切片(例如,使用N个整数)以及通过ndarray的方法和属性来访问和修改ndarray的内容。
不同的是,ndarrays可以共享相同的数据, 因此在一个ndarray中进行的更改可能在另一个中可见。 也就是说,ndarray可以是另一个ndarray 的 “view” ,它所指的数据由 “base” ndarray处理。 ndarrays也可以是Python拥有的内存strings或实现 buffer 或数组接口的对象的视图。
一个 ndarray是具有相同类型和大小的项目的多维容器。 尺寸和数组中的项目的数量是由它的shape定义, 它是由N个非负整数组成的tuple(元组),用于指定每个维度的大小。
不同的是,ndarrays可以共享相同的数据, 因此在一个ndarray中进行的更改可能在另一个中可见。 也就是说,ndarray可以是另一个ndarray 的 “view” ,它所指的数据由 “base” ndarray处理。 ndarrays也可以是Python拥有的内存strings或实现 buffer 或数组接口的对象的视图。
Examples:
>>> np.array([1, 2, 3]) array([1, 2, 3]) >>> np.array([1, 2, 3.0]) array([ 1., 2., 3.]) >>> np.array([[1, 2], [3, 4]]) array([[1, 2], [3, 4]]) >>> np.array([1, 2, 3], ndmin=2) array([[1, 2, 3]]) >>> np.array([1, 2, 3], dtype=complex) array([ 1.+0.j, 2.+0.j, 3.+0.j]) >>> x = np.array([(1,2),(3,4)],dtype=[('a','<i4'),('b','<i4')]) >>> x['a'] array([1, 3]) >>> np.array(np.mat('1 2; 3 4')) array([[1, 2], [3, 4]]) >>> np.array(np.mat('1 2; 3 4'), subok=True) matrix([[1, 2], [3, 4]]) >>> np.ndarray(shape=(2,2), dtype=float, order='F') array([[ -1.13698227e+002, 4.25087011e-303], [ 2.88528414e-306, 3.27025015e-309]]) #random >>> np.ndarray((2,), buffer=np.array([1,2,3]), offset=np.int_().itemsize, dtype=int) # offset = 1 * itemsize, i.e. skip first element array([2, 3])数组属性反映了数组本身固有的信息。通常,通过其属性访问数组允许您获取并有时设置数组的内部属性,而无需创建新数组。公开的属性是数组的核心部分,只有一些属性可以有意义地重置而无需创建新数组。有关每个属性的信息如下。
以下属性包含有关数组内存布局的信息:
方法 描 述 | ndarray.flags | 有关数组内存布局的信息。 | ndarray.shape | 数组维度的元组。 | ndarray.strides | 遍历数组时每个维度中的字节元组。 | ndarray.ndim | 数组维数。 | ndarray.data | Python缓冲区对象指向数组的数据的开头。 | ndarray.size | 数组中的元素数。 | ndarray.itemsize | 一个数组元素的长度,以字节为单位。 | ndarray.nbytes | 数组元素消耗的总字节数。 | ndarray.base | 如果内存来自其他对象,则为基础对象。可以在dtype属性中找到与该数组关联的数据类型对象 :
方法 | 描 述 | ndarray.dtype | 数组元素的数据类型。zeros_like()、ones_like()、empty_like() 等带 _like() 的函数创建与参数数组的形状及类型相同的数组。
frombuffer()、fromstring()、fromfile() 等函数可以从字节序列或文件创建数组