numpy模块
一、ipython
ipython:交互式的python命令行
安装方法:pip install ipython
tab:键自动完成,会提示和输入相关的所有内置方法或属性等
?:内省、命名空间搜索,输入的内容跟上?会显示与其相关的介绍、参数等
!:!跟系统命令,就会执行该系统命令
魔术命令:以%开始
%run:可直接执行一个可执行文件的代码
%paste:执行剪切来的代码
%timeit:评估代码运行时间
%pdb:自动调试
使用命令历史
获取输入输出结果
目录标签系统
IPython Notebook

常用的魔术命令:

python调试器命令:

二、Numpy:数组计算
NumPy是高性能科学计算和数据分析的基础包,它是pandas等其他各种工具的基础。 NumPy的主要功能: (1)ndarray,一个多维数组结构,高效且节省空间 (2) 无需循环对整组数据进行快速运算的数学函数 (3)*读写磁盘数据的工具以及用于操作内存映射文件的工具 (4)*线性代数、随机数生成和傅里叶变换功能 (5)*用于集成C、C++等代码的工具
安装方法:pip install numpy
引用方法:import numpy as np
Numpy:ndarray-多维数组对象 为什么使用ndarray: (1)已知若干家跨国公司的市值(美元),将其换算为人民币 (2)已知购物车中每件商品的价格与商品件数,求总金额 用python内置方法: 答案: (1) money=[i*6.3 for i in range(1,100)] transform=map(lambda x:x*6.3,range(1,100))
import random
li = [random.uniform(10,20) for _ in range(1000)]
ratio = 6.3
list(map(lambda x:x*ratio, li)) (2) total=0 test=lambda sum:[i*j for i,j in zip(range(1,4),range(1,4))] for i in test(sum): total+=i print(total)
创建ndarray:np.array()
(1) import random
li = [random.uniform(10,20) for _ in range(1000)]
ratio = 6.3
arr = np.array(li)*ratio
(2) p = [random.uniform(10,20) for _ in range(1000)]
n = [random.randint(1,10) for _ in range(1000)]
arr_p = np.array(p)
arr_n = np.array(n)
total=(arr_p * arr_n).sum()
创建ndarray:np.array() ndarray是多维数组结构,与列表的区别是: (1) 数组对象内的元素类型必须相同 (2) 数组大小不可修改 常用属性: (1)T 数组的转置 (2)dtype 数组元素的数据类型 (3)size 数组元素的个数 (4)ndim 数组的维数 (5)shape 数组的维度大小(以元组形式) ndarray数据类型:dtype: (1)布尔型:bool_ (2)整型:int_ int8 int16 int32 int 64 (3)无符号整型:uint8 uint16 uint32 uint64 (4)浮点型:float_ float16 float32 float64 (5)复数型:complex_ complex64 complex128创建ndarray:
(1)array() 将列表转换成数组,可选择指定dtype
(2)arange() range的numpy版,支持浮点数
(3)linspace() 类似arange(),第三个参数为数组长度
(4)zeros() 根据指定形状和dtype创建全0数组
(5)ones() 根据指定形状和dtype创建全1数组
(6)empty() 根据指定形状和dtype创建全空数组(随机值,可能是之前遗留的随机值)
(7)eye() 根据指定边长和dtype创建单位矩阵(最简矩阵)
示例:
import numpy as np
li = [[1,2,3],[4,5,6]]
arr = np.array(li)
(1)arr
array([[1, 2, 3], [4, 5, 6]])
(2)arr.T # 转置
array([[1, 4], [2, 5], [3, 6]])
(3)arr.size
6
(4)arr.shape
(2, 3) # 2行3列
(5)arr.ndim
2 #二维数组
(6)arr.dtype
dtype('int32')
(7)2**16-1
65535 #16位没有负数可存储的最大数
2**15-1 #16位有负数可存储的最大数
(8)
arr = np.empty(12, dtype='int')
for i in range(len(arr)):
arr[i] = i
arr
result:array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) #可创建数组
(9)np.arange(3,10,0.3) #[3,10]之间每隔0.3取一个数
result:
array([ 3. , 3.3, 3.6, 3.9, 4.2, 4.5, 4.8,
5.1, 5.4, 5.7, 6. , 6.3, 6.6, 6.9,
7.2, 7.5, 7.8, 8.1, 8.4, 8.7, 9. ,
9.3, 9.6, 9.9])
(10)x=np.linspace(-100,100,10000)
y=x**2
plt.plot(x,y)
plt.show() #能画出二次函数
(11)np.eye(3) #三行三列的最简矩阵
result:
array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]])
(12)np.zeros((3,2,4)) #三维二行四列
result:
array([[[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]],
[[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]],
[[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]]])
(13)np.arange(15).reshape((3,5)) #将一维数组变为三行五列的二维数组
result:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
(14)arr = np.arange(15, dtype='int') 创建类型为int的一维数组
arr
result: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
(15)arr=np.arange(15,dtype='int') #一维数组
arr.dtype='float32' #只改变解释方式,没有改变数据
(16)arr.astype('float') #将int类型转换成float类型
result: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11.])
Numpy:
(1)数组和标量之间的运算
a+1 a*3 1//1 a**0.5
(2)同样的大小数组之间的运算
a+b a/b a**b
(3)数组的索引:
一维数组:a[5]
多维数组:
列表式写法:a[2][3]
新式写法:a[2,3] (推荐)
(4)数组的切片:
一维数组:a[5:8] a[4:] a[2:10]
多维数组:a[1:2,3:4] a[:,3:5] a[:,1]
(5)与列表不同,数组切片时不会自动复制,在切片数组上的修改会影响原数组
解决方法:copy()
(6)布尔型索引
question1:给一个数组,选出数组中所有大于5的数
result1:a[a>5]
原理:
- a>5会对a中的每一个元素进行判断,返回一个布尔数组
- 布尔型索引:将同样大小的布尔数组传进索引,会返回一个由所有True对应位置
的元素的数组
question2:给一个数组,选出数组中所有大于5的偶数
result2:a[(a>5)&(a%2==0)]
question3:给一个数组,选出数组中所有大于5的数和偶数
result3:a[(a>5)|(a%2==0)]
(7)花式索引
question1:对于一个数组,选出其第1,3,4,6,7个元素,组成新的二维数组
result1:a[[1,3,4,6,7]]
question2:对于一个二维数组,选出其第一列和第三列,组成新的二维数组
result2:a[:,[1,3]]
(8)通用函数
- 能同时数组中所有元素进行运算的函数
- 常见通用函数:
一元函数:abs,sqrt,exp,log,ceil,floor,rint,trunc,modf,isnan,isinf,cos,sin,tan
二元函数:add,substract,multiply,divide,power,mod,maximun,mininum
ceil(向上取整): 3.1 -> 4 -3.1 -> -3
floor(向下取整): 3.1 -> 3 -3.1 -> -4
rint(四舍五入): 3.1 -> 3 3.6 -> 4 -3.1 -> -3 -3.6 -> -4
rint(四舍五入): 3.1 -> 3 3.6 -> 4 -3.1 -> -3 -3.6 -> -4
(9)浮点数特殊值
- 浮点数:float
- 浮点数有两个特殊值:
nan(not a number):不等于任何浮点数(nan!=nan),表示数据缺失值
inf(infinity):比任何浮点数都大
(10)数学和统计方法
常用方法:
sum 求和
cumsum 求前缀和
mean 求平均数
std 求标准差
var 求方差
min 求最小值
max 求最大值
argmin 求最小值索引
argmax 求最大值索引
(11)随机数生成
- 随机数生成函数在np.random子包内
- 常用函数
rand 给定形状产生随机数组(0到1之间的数)
randint 给定形状产生随机整数
choice 给定数组产生随机选择
shuffle 与random.shuffle相同
uniform 给定数组产生随机数组
示例: numpy索引与切片 (1) arr = np.arange(20).reshape(4,5) arr array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19]]) arr[1,2] result:7 (2)np.arange(10)[:-1] result:array([0, 1, 2, 3, 4, 5, 6, 7, 8]) (3)arr[:,1:4] #取2,3,4列 result: array([[ 1, 2, 3], [ 6, 7, 8], [11, 12, 13], [16, 17, 18]]) (4)arr[:,1] result:array([ 1, 6, 11, 16]) 取出第一列组成数组 (5)arr = np.arange(5) arr result:array([0, 1, 2, 3, 4]) brr = arr[3:].copy() brr result:array([3, 4]) brr[0] = 10 arr result:array([0, 1, 2, 3, 4]) (6) a = [1,2,3,4,5] b = a[:3] b[0]=10 a result:[1, 2, 3, 4, 5] (7)li = [random.randint(0,10) for _ in range(20)] li result:[10, 1, 3, 6, 6, 5, 3, 3, 1,
6, 3, 8, 9, 10, 7, 5, 6, 1, 1, 8] #产生20个在(0,10)之间的随机数
(8)b=arr>5
arr[b]
result: array([10, 6, 6, 6, 8, 9, 10, 7, 6, 8]) 返回数组中大于5的数重新组成的数组
(9) x = np.array([1,2,3,4,5])
x[[True, False,False,True,True]] #返回true位置的数
result:array([1, 4, 5])
(10)arr[~(arr>5)]
result:array([1, 3, 5, 3, 3, 1, 3, 5, 1, 1]) 返回数组中小于5的数重新组成的数组
(11)arr[[1,3,4,6,7]] #魔术索引,返回索引为1,3,4,6,7的一维数组
result:array([1, 6, 6, 3, 3])
(12)arr = np.arange(20).reshape(4,5)
arr
result:array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
arr[:,[1,3]] #取出二维数组的第一列和第四列
result:array([[ 1, 3],
[ 6, 8],
[11, 13],
[16, 18]])
(13)arr[[0,2],[1,3]] #取出第一行第一列的数和第三行第四列的数组成一维数组
result:array([ 1, 13])
(14)arr[[0,2],:][:,[1,3]]
result:array([[ 1, 3], [11, 13]])
(15)arr = np.array([1,-2,3,-4])
np.sqrt(np.abs(arr))
result:array([ 1. , 1.41421356, 1.73205081, 2. ])
(16)
arr = np.arange(0,5,0.2)
np.modf(arr)
result:
(array([ 0. , 0.2, 0.4, 0.6, 0.8, 0. , 0.2, 0.4, 0.6, 0.8, 0. , 0.2, 0.4, 0.6, 0.8, 0. , 0.2, 0.4, 0.6, 0.8, 0. , 0.2, 0.4, 0.6, 0.8]),
array([ 0., 0., 0., 0., 0., 1., 1., 1., 1., 1., 2., 2., 2., 2., 2., 3.,
3., 3., 3., 3., 4., 4., 4., 4., 4.]))
(17)
a = np.array([6,3,2,1,0])
b = np.array([0,1,2,3,4])
c = a / b
(18)c[~np.isnan(c)]
result:array([ inf, 3. , 1. , 0.33333333, 0. ])
(19)np.maximum(a,b)
result:array([6, 3, 2, 3, 4])
(20)arr.std() #方差表示一组数的离散程度
result:3.4520525295346629
(21)arr = np.array([random.uniform(10,30) for _ in range(10000)])
(arr.mean()-2*arr.std(), arr.mean()+2*arr.std())
result:(8.4985570120388783, 31.752980328736868)
(22)arr = np.arange(100)
arr[10:20].sum()
result:145
(23)b = arr.cumsum()
b[19] - b[9]
result:145
(24)np.median(arr) #中位数
result:49.5
(25)x.min()
result:1
(26)x.argmin()
result:0
(27)np.random.randint(10,20,(3,5))
result:array([[13, 11, 19, 11, 11],
[12, 18, 18, 13, 10],
[19, 16, 12, 19, 10]])
(28)np.random.choice(list('asdfghjgh'),10)
result:array(['s', 'a', 'g', 'd', 's', 'a', 'h', 'h', 'a', 'h'], dtype='<U1')
(29)li = [1,2,3,4,5]
random.shuffle(li)
li
result:[4, 5, 1, 2, 3]
(30)
import matplotlib.pyplot as plt
a = np.random.uniform(10,20,1000000)
plt.hist(a, 100)
plt.show()
(31)
a = np.random.normal(0, 10000, 1000000)
plt.hist(a,100)
plt.show() #正态分布

浙公网安备 33010602011771号