Numpy复习

1.Jupyter notebook中的魔法命令

%run 在Jupyter中加载.py文件

先搞清楚Jupyter中文件的默认路径,修改完后再运行

import os
print(os.path.abspath('.'))
F:python_DemoCodeJuypterNotebook
%run ../fushi/P2018_1.py

导入模块(二选一即可)

import mymodule.FirstML
mymodule.FirstML.predit(1)
from mymodule import FirstML
FirstML.predit(1)

%timeit测试代码性能(会多次执行,%%time可以测试区域代码)

%timeit L=[i**2 for i in range(1000000)]
1 loop, best of 3: 459 ms per loop
%%timeit
L=[]
for i in range(1000):
    L.append(i**2)
1000 loops, best of 3: 477 µs per loop

Tip:因为%timeit会执行多次,如果后面紧跟的语句每次执行的效率差别较大的话,取平均值的意义不大。

%time执行一次计时

%time L=[i**2 for i in range(1000)]
Wall time: 486 µs

其他魔法命令:

%lsmagic显示所有魔法命令

%run? run魔法命令对应文档

2.numpy基础

list的特点:数据类型可以不同,效率较低
array的特点:数据类型相同
import array
arr=array.array('i',[i for i in range(10)])
arr
Out[7]:array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

arr[5]=100
arr
Out[8]:array('i', [0, 1, 2, 3, 4, 100, 6, 7, 8, 9])

numpy.array的创建

import numpy as np
nparr=np.array([i for i in range(10)])
nparr
Out[9]:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

nparr.dtype
Out[10]:dtype('int32')

nparr[5]=5.0
nparr
Out[11]:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])    #对于整型来说,传给他浮点数会自动截位

nparr2=np.array([1,2,3.0])
nparr2.dtype
Out[13]:dtype('float64')
其他创建numpy.array的方法
ones,zeros,eye方法默认元素类型都是浮点型,full取决于后面的val类型。
np.zeros(10)
Out[14]:array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

np.zeros((3,5),dtype=int)          #np.zeros(shape=(3,5),dtype=int)
Out[15]: array([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]])

arange方法和python2中的arange方法类似,默认值是0-n-1,但是它支持步长为小数。

np.arange(10)
Out[16]:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.arange(0,20,2)
Out[17]:array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])

np.arange(0,
1,0.2) Out[18]:array([ 0. , 0.2, 0.4, 0.6, 0.8])

np.linspace(0,20,10)    #0到20之间等间距地分成10份,包含0和20两个点

np.linspace(0,20,10)
Out[20]:
array([  0.        ,   2.22222222,   4.44444444,   6.66666667,
         8.88888889,  11.11111111,  13.33333333,  15.55555556,
        17.77777778,  20.        ])

numpy.random

random()         [0,1)之间的随机浮点数

np.random.seed(666)
np.random.randint(0,10,10) #创建10个[0,10)之间的整数(注意前闭后开) Out[21]:array([3, 6, 8, 6, 2, 7, 9, 2, 3, 9])
np.random.randint(4,8,size=(3,5))
Out[22]:
array([[4, 5, 5, 5, 4],
[4, 7, 4, 6, 4],
[7, 6, 5, 7, 4]])
np.random.random(10)      #10是指size
Out[23]:
array([ 0.50242227, 0.17298419, 0.26348954, 0.600199 , 0.6691488 ,
      0.39283773, 0.37043944, 0.30396405, 0.99071216, 0.65455463])

默认符合均值为0,方差为1的随机浮点数

np.random.normal(10,100,size=(3,5))
Out[26]:
array([[ -24.5258828 ,  -23.72306007,    6.88579462,  -23.29286657,   -33.32319528],
       [ -39.33190778,    2.43981867,  -30.17166951,    6.22937488,   3.79212453],
       [  22.72826743, -156.27817465,    8.43966765,  -46.36703314,   33.91110828]])

查看相关文档:

np.random.normal?可以调出normal相关文档(会开一个新页面)。

np.random?调出random模块相关文档(会开一个新页面)。

  help(np.random.normal)

numpy.array的基本操作

numpy.array的数据访问

1.索引访问

2.切片访问

X=np.arange(15).reshape(3,5)
X
Out[27]:
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

X[2,2]
Out[28]:12

X[:2,:3]
Out[29]:
array([[0, 1, 2],
          [5, 6, 7]])

X[:,:3]                            #选取某个维度用单个:
Out[30]:
array([[ 0,  1,  2],
       [ 5,  6,  7],
       [10, 11, 12]])

subX=X[:2,:3]

subX获得的是对原X的引用,对subX的操作会作用到原X中,同步变化(浅拷贝)

subX2=X[:2,:3].copy()

subX获得的是对原X的副本,对subX的操作不会作用到原X中(深拷贝)

numpy.array的数组变换

x=np.arange(10)
x
Out[31]:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

x.reshape(2,5)
Out[32]:
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

x.reshape(5,-1)           #只关心第一维度5行,第二维度自动计算(能自动整除,否则报错),可赋值为-1
Out[33]:
array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7],
       [8, 9]])

矩阵的合并与分割

x=np.array([1,2,3])
y=np.array([3,2,1])
z=np.array([6,6])
np.concatenate([x,y,z])
Out[34]:
array([1, 2, 3, 3, 2, 1, 6, 6])

A=np.array([[1,2,3],
            [3,4,5]])
np.concatenate([A,A])
Out[35]:
array([[1, 2, 3],
       [3, 4, 5],
       [1, 2, 3],
       [3, 4, 5]])

np.concatenate([A,A],axis=1)          #axis表示维度,默认为0
Out[36]:
array([[1, 2, 3, 1, 2, 3],
       [3, 4, 5, 3, 4, 5]])

np.concatenate([A,x.reshape(1,-1)])  #concatenate只能处理维数一致的情况,不一致的话要转换
Out[37]:
array([[1, 2, 3],
       [3, 4, 5],
       [1, 2, 3]])

或者采用vstack(竖直方向堆叠)
np.vstack([A,x])
Out[38]:
array([[1, 2, 3],
       [3, 4, 5],
       [1, 2, 3]])

hstack(水平方向堆叠) B
=np.array([[1,1], [1,1]]) np.hstack([A,B]) Out[40]: array([[1, 2, 3, 1, 1], [3, 4, 5, 1, 1]])

np.split()

x=np.arange(10)
np.split(x,[3,7])         #以3或7为间隔分割
Out[41]:[array([0, 1, 2]), array([3, 4, 5, 6]), array([7, 8, 9])]

np.split(x,5)              #第二个参数为整数表示用该数平均切分,不能整除会报错
Out[42]:[array([0, 1]), array([2, 3]), array([4, 5]), array([6, 7]), array([8, 9])]

A=np.arange(16).reshape([4,4])
np.split(A,[2])             #默认是按行的维度
Out[45]:
[array([[0, 1, 2, 3],
        [4, 5, 6, 7]]), 
 array([[ 8,  9, 10, 11],
        [12, 13, 14, 15]])]

np.split(A,[2],axis=1)
Out[46]:
[array([[ 0,  1],
        [ 4,  5],
        [ 8,  9],
        [12, 13]]), 
 array([[ 2,  3],
        [ 6,  7],
        [10, 11],
        [14, 15]])]

np.vsplit(A,[2])        #上下分割
Out[47]:
[array([[0, 1, 2, 3],
        [4, 5, 6, 7]]), 
 array([[ 8,  9, 10, 11],
        [12, 13, 14, 15]])]

np.hsplit(A,[2])
Out[48]:                 #左右分割
[array([[ 0,  1],
        [ 4,  5],
        [ 8,  9],
        [12, 13]]), 
 array([[ 2,  3],
        [ 6,  7],
        [10, 11],
        [14, 15]])]

分割可以应用于分离数据的特征和标签

x,y=np.hsplit(A,[-1])
y[:,0]
Out[50]:array([ 3,  7, 11, 15])

numpy.array中的运算

一元函数:

+,-,*,/,//,**,%作用于数组的每一个元素

 

 np.power(3,x)==3**x      计算数组各元素的3的指数次方         

二元函数(矩阵之间的运算要保证是可以运算的)

 A*B是指对应元素相乘

A.dot(B)是数学意义上的矩阵乘法运算

 A.T是矩阵A的转置

向量和矩阵的运算

一个向量和一个矩阵做加法,这个向量和这个矩阵中的每一行做加法

A=np.arange(1,5).reshape([2,2])
v=np.array([1,2])
v+A
Out[54]:
array([[2, 4],
       [4, 6]])

np.vstack([v]*A.shape[0])  #水平方向堆叠
Out[56]:
array([[1, 2],
       [1, 2]])

np.tile(v,(2,1))           #元组(2,1)表示行向量堆叠2次,列向量堆叠1次
Out[57]:
array([[1, 2],
       [1, 2]])

v.dot(A)
Out[59]:array([ 7, 10])

A.dot(v)                     #v被看成2*1的矩阵
Out[60]:array([ 5, 11])

矩阵的逆

A 为方阵时:

A的逆=np.linalg.inv(A)

A*A的逆=单位矩阵

A=np.arange(4).reshape(2,2)
np.linalg.inv(A)
Out[61]:
array([[-1.5,  0.5],
       [ 1. ,  0. ]])

A.dot(np.linalg.inv(A))
Out[67]:
array([[ 1.,  0.],
       [ 0.,  1.]])

A非方阵时,A的伪逆矩阵=np.linalg.pinv(A)

聚合运算

 

 prod(a)                                              计算数组a中的元素之积

percentile(a,q)                                    数组中q%个元素小于等于的值(q=50时,该值等于中位数)

A=np.arange(16).reshape(4,-1)
A
Out[69]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

np.sum(A,axis=0)                 #把行压缩掉,就是对每列相加
Out[70]:array([24, 28, 32, 36])

np.sum(A,axis=1)                 #对每行相加
Out[71]:array([ 6, 22, 38, 54])

排序

sort()

A=np.random.randint(10,size=(4,4))
A
Out[73]:
array([[7, 7, 7, 0],
       [6, 2, 9, 2],
       [7, 5, 5, 0],
       [0, 5, 1, 6]])

np.sort(A,axis=1)              #默认axis=1,按行排序
Out[74]:
array([[0, 7, 7, 7],
       [2, 2, 6, 9],
       [0, 5, 5, 7],
       [0, 1, 5, 6]])

np.sort(A,axis=0)              #按列排序
Out[75]:
array([[0, 2, 1, 0],
       [6, 5, 5, 0],
       [7, 5, 7, 2],
       [7, 7, 9, 6]])
x=np.arange(16)
np.random.shuffle(x)
x
Out[77]:array([10,  9, 13, 15,  4, 11, 14,  5,  0,  3,  2,  7,  6,  8, 12,  1])

np.argsort(x)             #根据索引项排序后即为正序
Out[78]:array([ 8, 15, 10,  9,  4,  7, 12, 11, 13,  1,  0,  5, 14,  2,  6,  3], dtype=int64)

np.partition(x,4)        #一次快排的结果,4前面的元素比4小,后面的元素比4大
Out[79]:array([ 1,  0,  2,  3,  4,  5, 14,  9, 11, 15, 13,  7,  6,  8, 12, 10])

 numpy中的比较和FancyIndexing

 numpy提供对索引数组的访问

x=np.arange(16)
ind=[3,5,8]
x[ind]
Out[80]:array([3, 5, 8])

ind=np.array([[0,2],
             [1,3]])
x[ind]
Out[81]:
array([[0, 2],
       [1, 3]])

A=x.reshape(4,-1)
row=np.array([0,1,2])
col=np.array([1,2,3])       #三个点坐标分别为(0,1)(1,2)(2,3)
A[row,col]
Out[83]:array([ 1,  6, 11])

A[:2,col]
Out[84]:
array([[1, 2, 3],
       [5, 6, 7]])

对bool值进行FancyIndexing

比较运算符:<,>,<=,>=,==,!=

col=[True,False,True,True]
A[1:3,col]
Out[84]:
array([[4, 6, 7],
       [8, 10, 11]])

A<4
Out[86]:
array([[ True,  True,  True,  True],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False]], dtype=bool)

2*x==24-4*x
Out[87]:
array([False, False, False, False,  True, False, False, False, False,
       False, False, False, False, False, False, False], dtype=bool)

np.sum(x<=3)              #实际应用eg年龄小于4的学生个数,等价于np.count_nonzero(x <= 3)
Out[89]:4

np.sum(x%2==0)            #偶数个数(通过axis可以指定列数)
np.sum((x>3) & (x<10))    #注意中间只用位运算符
np.any(x==0)              #是否存在为0的数字,返回True
np.all(x>0)               #是否所有的数都大于0,返回False

np.sum(~(x==0))           #等价于np.sum(x!=0)
x[x<5]                    #小于5岁的学生的具体年龄
Out[94]:array([0, 1, 2, 3, 4])

A[A[:,3]%3==0,:]          #抽取出满足最后一个数3整除的行
Out[95]:
array([[ 0,  1,  2,  3],
       [12, 13, 14, 15]])
原文地址:https://www.cnblogs.com/cxq1126/p/12996932.html