介绍:
NumPy是一个运行速度非常快的数学库,主要用于数组计算,包含一个强大的N维数组对象 ndarray、广播功能函数、整合 C/C++/Fortran代码的工具和线性代数、傅里叶变换、随机数生成等功能。
一,ndarray对象
1,ndarray的组成内容
-
一个指向数据(内存或内存映射文件中的一块数据)的指针。
- 数据类型或 dtype,描述在数组中固定大小值的格子。
- 一个表示数组形状(shape)的元组,表示各维度大小的元组。
- 一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要“跨过”的字节数。
二, NumPy的数据类型
三,数组属性
四,新建数组
1,darray构造器
# order:创建数组的样式,C为行方向,F为列方向,A为任意方向
# numpy.array(object,dtype = None, copy =True, order = None, subok = False, ndmin = 0)
a = np.array([1,2,3])
b = np.array([[1,2],[3,4]]) # 二维数组,外面必须有一层方括号
c = np.array([1,2,3],dtype = complex) #复数
2,其他方法
【a】等差序列: ``np.linspace, np.arange``
.. ipython:: python
np.linspace(1,5,11) # 起始、终止(包含)、样本个数
np.arange(1,5,2) # 起始、终止(不包含)、步长
【b】特殊矩阵: ``zeros, eye, full``
.. ipython:: python
np.zeros((2,3)) # 传入元组表示各维度大小
np.eye(3) # 3*3的单位矩阵
np.eye(3, k=1) # 偏移主对角线1个单位的伪单位矩阵
np.full((2,3), 10) # 元组传入大小,10表示填充数值
np.full((2,3), [1,2,3]) # 每行填入相同的列表
【c】随机矩阵: ``np.random``
最常用的随机生成函数为 ``rand, randn, randint, choice`` ,它们分别表示0-1均匀分布的随机数组、标准正态的随机数组、随机整数组和随机列表抽样:
.. ipython:: python
np.random.rand(3) # 生成服从0-1均匀分布的三个随机数
np.random.rand(3, 3) # 注意这里传入的不是元组,每个维度大小分开输入
对于服从区间 :math:`a` 到 :math:`b` 上的均匀分布可以如下生成:
.. ipython:: python
a, b = 5, 15
(b - a) * np.random.rand(3) + a
一般的,可以选择已有的库函数:
.. ipython:: python
np.random.uniform(5, 15, 3)
``randn`` 生成了 :math:`N\rm{(\mathbf{0}, \mathbf{I})}` 的标准正态分布:
.. ipython:: python
np.random.randn(3)
np.random.randn(2, 2)
对于服从方差为 :math:`\sigma^2` 均值为 :math:`\mu` 的一元正态分布可以如下生成:
.. ipython:: python
sigma, mu = 2.5, 3
mu + np.random.randn(3) * sigma
五,从已有的数组创建数据
# 类似于numpy.array,但是numpy.asarray参数只有三个,比numpy.array少两个。
numpy.asarray(a, dtype = None, order = None)
# 用于实现动态数组。numpy.frombuffer接受buffer 输入参数,以流的形式读入转化成ndarray对象。
numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)
#从可迭代对象中建立 ndarray对象,返回一维数组。
numpy.fromiter(iterable, dtype, count=-1)
六,从数值范围创建数组
# 在numpy包中使用arange函数创建数值范围并返回ndarray对象。原型如下:
numpy.arange(start, stop, step, dtype)
# 用于创建一个一位数组。数组是有一个等差数列构成的,原型如下:
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
# 创建一个于等比数列。原型如下:
np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
七,切片和索引
ndarray对象的内容可以通过索引或切片来访问和修改,与Python中list的切片操作一样。
# 切片索引 =================================================
# ndarray数组可以基于0~n的下标进行索引,切片对象可以通过内置的slice函数
a = np.arange(10)
s = slice(2,7,2) #从索引 2 开始到索引 7 停止,间隔为2
# 可以也通过冒号分隔切片参数start:stop:step来进行切片操作:
b = a[2:7:2] #从索引 2 开始到索引 7 停止,间隔为2
# 整数数组索引 =================================================
# 以下实例获取数组中(0,0)、(1,1)和(2,0)位置处的元素。
x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0,1,2], [0,1,0]]
print (y)
# 布尔索引 ======================================================
# 我们可以通过一个布尔数组来索引目标数组。布尔索引通过布尔运算(如比较运算符)来获取符合指定条件的元素的数组。
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print ('我们的数组是:')
print (x)
print ('\n')
print ('大于5的元素是:') # 现在我们会打印出大于5的元素
print (x[x > 5])
# 花式索引======================================================
# 花式索引指的是利用整数数组进行索引。花式索引根据索引数组的值作为目标数组某个轴的下标来取值。
arr3d = np.arange(12).reshape(2, 2, 3)
# 使用两个整数数组来对axis= 0,1两个轴进行花式索引
print(arr3d[[0, 1], [1, 1]])
print(arr3d[[0, 1], [0, 1, 2]]) # error
# 输出
[[ 3 4 5]
[ 9 10 11]]
八,迭代数组
【数据分析之道-NumPy(五)】numpy迭代数组_i阿极(暂时无法回复版)的博客-CSDN博客
九,数组操作函数
# 修改数组形状 =============================
# 可以在不改变数据的条件下修改形状。
numpy.zeros(shape, dtype = float, order = 'C')
# 一个数组元素迭代器
numpy.ndarray.flat
# 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组。原型如下:
ndarray.flatten(order='C')
# 该函数展平的数组元素,顺序通常是"C风格",返回的是数组视图(view,有点类似C/C++引用reference的意思),修改会影响原始数组。
numpy.ravel
# 翻转数组=============================
#用于对换数组的维度。
numpy.transpose(arr, axes)
# 向后滚动特定的轴到一个特定位置。
numpy.rollaxis(arr, axis, start)
# 用于交换数组的两个轴。
numpy.swapaxes(arr, axis1, axis2)
十,应用