NumPy包括的内容
-
NumPy系统是 Python的一种开源的数值计算扩展,是一个用 python实现的科学计算包。包括:
-
一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组,称为 ndarray(N-dimensional array object )
-
用于对整组数据进行快速运算的标准数学函数, func( universal function object)
- 用于整合C/C++和 Fortran代码的工具包
-
实用的线性代数、傅里叶变换和随机数生成函数。NumPy和稀疏矩阵运算包 SciPy配合使用更加方便
-
- ndarray: N-dimensional array,N维数组
- 一种由相同类型的元素组成的多维数组,元素数量是事先指定好的
-
元素的数据类型由 dtype(data-type)对象来指定,每个 ndarray只有一种 dtype
类型 -
大小固定,创建好数组时一旦指定好大小,就不会再发生改变
#coding=utf-8 import numpy as np # 建立Ndarray多维数组 arr = np.array([[[1,2,3,4],[2,3,4,5]]]) print(arr.ndim) # 数组的形状,数组每个维度的数据量 # ndarray的巧算 ## 1,先规范好ndarray数组 ## 2。去掉外围的[] print(arr.shape) # 数组的数据类型 print(arr.dtype) print(np.array(['1','2','3','4'], dtype=np.int)) print(np.array(['python','javac','c#','javascript','golang'],dtype='|S4')) print(arr.size) print(arr[0][1][1])
结果
3 (1L, 2L, 4L) int32 [1 2 3 4] ['pyth' 'java' 'c#' 'java' 'gola'] 8 3
ndarray的常见创建方式
■ array函数:接收一个普通的 Python序列,转成 harray
■ zeros函数:创建指定长度或形状的全零数组
■ ones函数:创建指定长度或形状的全1数组
■ empty函数:创建一个没有任何具体值的数组(准确地说是一些未初始化的垃圾
值)
使用zeros, ones, empty 创建时,会自动填充好值,empty会创建一些随机的数值用来填充。
zeros,默认数据类型为float,维度的定义使用元组
import numpy as np print(np.zeros(2))
用元组指定维度,如(2,3)代表2行3列,第一个维度为2,第二个维度为3
print(np.zeros((2,3)))
ones 使用1进行填充
# ones 使用1进行填充 print(np.ones((5,6), dtype=np.int))
print(np.ones((5,6,2), dtype=np.int))
empty 填充随机值
print(np.empty((7,20)))
ndarray的其他刨建方式
■ arrange函数:类似于 python的 range函数,通过指定开始值、终值和步长来创建-维数组,注意
数组不包括终值
■ linspace函数:通过指定开始值、终值和元素个数来创建一维数组,可以通过 endpoint关键字指
定是否包括终值,缺省设置是包括终值
■ logspace函数:和 linspace类似,不过它创建等比数列
■使用随机数填充数组,即使用 numpy! random模块的 random函数,数组所包含的的元素数量由
参数决定
arange和range相似
# range(2,20,3) 从2开始,到20结束,取不到20,步长3 print(range(2,20,3)) print(np.arange(2,20,3))
linspace生成一个等差序列
linspace(2,20,3)
第一值代表起始数,第二个代表结束数,生成元素的个数
print(np.linspace(2,20,3))
logspace 生成一个等比数列
logspace(2,20,3)
第一个值代表10的2次方,第二个数代表10的20次方,第三个数代表生成的元素的个数
# 第一个值代表10的2次方,第二个数代表10的20次方,第三个数代表生成的元素的个数 print(np.logspace(2,20,3))
# 一维数组转多维数组 print(np.arange(2,20,2)).reshape((3,3)) print(np.arange(2,20,2)).reshape((3, -1)) # -1则会自动计算维度值
random 生成随机数
# random 生成随机数 print(np.random.random((2,3,4)))
np.random.random()底层调用的是np.random.random_sample() 生成每一位随机数的方法
print(np.random.random_sample((2,3,4)))
NumPy中的数据类型
■创建 NumPy数组时可以通过 dtype属性显式指定数据类型,如果不指定, NumPy
会自己推断出合适的数据类型,所以一般无需显式指定
■ astype方法,可以转换数组的元素数据类型,得到一个新数组
nparray02 = np.array([1,2,3,4]) print(nparray02.dtype)
arr2 = np.arange(2,10,2) print(arr2) print(arr2.dtype) arr3 = arr2.astype('float') print(arr3) print(arr3.dtype)
arr2 = np.arange(2,10,2) print(arr2) print(arr2.dtype) arr3 = arr2.astype('float') print(arr3) print(arr3.dtype) arr4 = arr2.astype('|U2') #使用Unicode编码,每个元素长度为2 print(arr4) print(arr4.dtype) arr5 = arr2.astype('|S2') #使用String进行编码(转为十六进制编码),每个元素长度为2 print(arr5) print(arr5.dtype)
改变 array形状
reshape
arr6 = np.arange(20) print(arr6) print(arr6.reshape((4,5)))
形状是可变的,但是元素的个数是不变的
arr1 = np.arange(20)
视图
多个变量使用(指向)一个内存地址(空间)
arr2=arr1. reshape((2, 10))
副本
把原来的内容,重新复制(拷贝)了一份新的数据,放到新的内存地址(空
即使修改了其中一个变量的元素值,并不会影响另外一个变量
arr3 = arr1.copy() # 拷贝,生成副本
- reshape函数不会改变原来的 ndarray,但是得到的新的 ndarray是原数组的视图
- 对于 ndarray的一些方法操作,首要区分是否会改变原来变量,以此来判断是视图还是副本
在开发的时候对数据进行修改时要注意是否会对数据产生影响,可以考虑拷贝数据进行操作
■直接修改 ndarray的 shape值
■使用 reshape函数,可以创建一个改变了尺寸的新数组,原数组的 shape保持不
变,但注意他们共享内存空间,因此修改任何一个也对另一个产生影响,因此注
意新数组的元素个数必须与原数组一样
■当指定新数组某个轴的元素为-1时,将根据数组元素的个数自动计算此轴的长度
Numpy 的基本操作
■数组与标量、数组之间的运算
■数组的矩阵积( matrix product)
■数组的索引与切片
■数组转置与轴对换
■通用函数:快速的元素级数组函数
■聚合函数
■np. where函数
■np. unique函数
数组与标量、数组之间的运算
数组很重要,因为它使你不用编写循环即可对数据执行批量运算。这通常就叫做矢量化
( vectorization)。大小相等的数组之间的任何算术运算都会将运算应用到元素级
■数组不用循环即可对毎个元素执行批量运算,这通常就叫做矢量化,即用数组表
达式代替循环的做法
■矢量化数组运算性能要比纯 Python方式快上一两个数量级
■大小相等的数组之间的任何算术运算都会将运算应用到元素级
有0被除的情况,在代码的最顶端导入
arr = np.arange(0,20,2) arr2 = arr +1 print(arr) print(arr2) print(arr * arr2) print(arr2/arr)
数据算术运算时,必须保证两边的数据的形状一致。
arr = np.random.random((2,3)) arr2 = np.random.random((3,2)) print(arr + arr2 )
数组的矩阵积( matrix product)
■两个二维矩阵(多维数组即矩阵)满足第一个矩阵的列数与第二个矩阵的行数相
同,那么可以进行矩阵乘法,即矩阵积,短阵积不是元素级的运算
■两个矩阵相乘结果所得到的的数组中每个元紊为,第一个矩阵中与该元素行号相
同的元素与第二个矩阵中与该元素列号相同的元素,两两相乘后求和
数组的索引与切片
NumPy数组的索引是一个内容丰富的主题,因为选取数据子集或单个元素的方式有很
多。一维数组很简单。从表面上看,它们跟 Python列表的功能差不多:
arr = np.arange(10) print(arr) print(arr[5]) print(arr[5:8]) arr[5:8] = 12 print(arr)
# 对于高维度数组,能做的事情更多。在一个二维数组中,各索引位置上的元素不再是标量而是一维数组: arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]]) print(arr2d[2])
因此,可以对各个元素进行递归访问,但这样需要做的事情有点多。你可以传入一个以逗号隔开的索引列表来选取单个元素。也就是说,下面两种方式是等价的:
#因此,可以对各个元素进行递归访问,但这样需要做的事情有点多。你可以传入一个以 #逗号隔开的索引列表来选取单个元素。也就是说,下面两种方式是等价的: print(arr2d[0][2]) print(arr2d[0,2])
二维数组的索引方式。
NumPy数组中的元素索引
在多维数组中,如果省略了后面的索引,则返回对象会是一个维度低一点的 ndarray(它含有高一级维度上的所有数据)。因此,在2×2×3数组arr3d中:
# 在多维数组中,如果省略了后面的索引,则返回对象会是一个维度低一点的 ndarray(它含有高一级维度上的所有数据)。因此,在2×2×3数组arr3d中:] arr3d = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]]) print(arr3d) # arr3d[0]是一个2×3数组: print(arr3d[0]) # 标量值和数组都可以被赋值给arr3d[0]: old_value = arr3d[0].copy() arr3d[0] = 42 print(arr3d)
切片索引
ndarray的切片语法跟 Python列表这样的一维对象差不多:
高维度对象的花样更多,你可以在一个或多个轴上进行切片,也可以跟整数索引混合使
用。对于上面那个二维数组arr2d,其切片方式稍显不同:
print("**************") print(arr2d) print("**************") print(arr2d[:2])
可以看出,它是沿着第0轴(即第一个轴)切片的。也就是说,切片是沿着一个轴向选
取元素的。你可以一次传入多个切片,就像传入多个索引那样:
print(arr2d[:2,1:])