Ndarray
NumPy中定义的最重要的类就是Ndarray,这是一个N维数组类型,用以描述相同类型的元素集合,其索引起始于0,可以认为Ndarray表示的是一个矩阵。Ndarray中的每个元素在内存中都使用相同大小的块。从Ndarray中提取的任何元素都是由一个数组标量类型的Python对象表示。Ndarray的实例可以通过不同的数组创建函数来构造,最基本的是使用numpy.array()
方法。
numpy.array()
可以从任何暴露数组接口的对象以及从返回数组的任何方法创建Ndarray。其完整格式为:
numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
其各项参数的含义是:
object
,用于构造Ndarray的原始序列;dtype
,数组内存储的数据的数据类型,可选;copy
,是否复制对象,可选,默认为True;order
,元素在内存中的排列方式,可以指定C(按行排列,C语言风格)、F(按列排列,Fortran和MATLAB的风格)、A(任意,默认风格);subok
,返回数组被强制为基类数组,否则返回子类;ndmin
,返回数组的最小维数。
除了numpy.array()
之外,还有以下函数可以快速的创建常用的或者经典的数组。
numpy.empty(shape, dtype, order)
,创建未初始化数组;numpy.zeros(shape, dtype, order)
,创建零值数组;numpy.ones(shape, dtype, order)
,创建1值数组;numpy.asarray(object, dtype, order)
,将Python序列转换为Ndarray;numpy.frombuffer(buffer, dtype, count, offset)
,将缓冲区内容转化为一维数组;numpy.fromiter(iterable, dtype, count)
,从迭代对象构建一个Ndarray;numpy.arange(start, stop, step, dtype)
,构建一个等间隔值的一维数组;numpy.linspace(start, stop, endpoint, retstep, dtype)
,构建一个均匀间隔的指定间隔数量的一维数组;numpy.logspace(start, stop, num, endpoint, base, dtype)
,构建一个对数刻度。
Ndarray也支持Python中的切片和索引操作,但稍有不同的是,NumPy提供一个slice()
函数,允许在Python传统方法之外创建一个切片对象,并以此来进行切片操作。slice()
函数可以接受三个参数,分别对应切片中的起始、终止和步长三个值。以下示例中的几种切片用法的效果都是等同的。
import numpy as np
a = np.arange(10)
s = slice(2, 9, 2)
print(a[s])
print(a[2:9:2])
Ndarray对象中的元素遵循基于零的索引,并且其切片功能是Python中切片概念延伸到多维的扩展。对于多维数组的切片,Numpy提供了更多的功能。在多维数组中,Ndarray可以在[]
中使用逗号分隔的索引来选择获取多维数组中的指定位置的元素,并且也支持在指定位置使用切片语法。
import numpy as np
a = np.array([1, 2, 3], [3, 4, 5], [4, 5, 6])
print(a[1:]) # 输出[[3, 4, 5], [4, 5, 6]],普通切片操作
print(a[..., 1]) # 输出[2, 4, 5],取的是第二列的元素
print(a[1, ...]) # 输出[3, 4, 5],取的是第二行的元素
print(a[..., 1:]) # 输出[[2, 3], [4, 5], [5, 6]],取的是第二列及其剩余元素
使用省略号(...
)进行切片的操作,可以选择出与数组维数相同长度的元组。如果在行位置使用省略号,将会选出包含行中元素的Ndarray。
如果在索引位置使用布尔表达式,则会使用比较运算来对元素进行筛选,例如a[a > 5]
将选出全部大于5的元素并组成新的Ndarray对象。