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对象。