numpy

来源:互联网 发布:碑文排版软件 编辑:程序博客网 时间:2024/06/06 01:23

导入numpy库

import  numpy as np
numpy默认ndarray的所有元素的类型是相同的
如果传进来的列表中包含不同的类型,则统一为同一类型,优先级:str>float>int
python 的list类型只能是一维,而ndarray可以是多维的
test=np.array([1,2,3,4,5])
test
array([1, 2, 3, 4, 5])
多维:
test=np.array([[1,2,3],[4,5,6]])
test
array([[1, 2, 3],
       [4, 5, 6]])

2. 使用np的routines函数创建
1) 利用1) np.ones(shape, dtype=None, order='C')函数创建二维全部为1的二维数组
np.ones([3,3])
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
                 [ 1.,  1.,  1.]])

同时可设置类型为整型
np.ones([3,3],dtype=int)
2)利用 np.zeros(shape, dtype=float, order='C')函数创建全部为0的二维数组
np.zeros([3,3])
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])
3)创建二维数组,内部值都为均一值
 np.full(shape, fill_value, dtype=None, order='C')
np.full([3,3],3.5)
array([[ 3.5,  3.5,  3.5],
       [ 3.5,  3.5,  3.5],
       [ 3.5,  3.5,  3.5]])

4)对角线值都为1 的二维数组
np.eye(N, M=None, k=0, dtype=float)    
array([[ 1.,  0.,  0.],
        [ 0.,  1.,  0.],
      [ 0.,  0.,  1.]])
K参数可写0,-1,1,2,-2,3(大于3则效果与3相同)

5)等差数列取值np.linspace()开始跟结束的值均能取到,其余的平分
 np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
np.linspace(0,10,11,dtype=int)
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10])


6)利用np.arange()求等差数列
 np.arange([start, ]stop, [step, ]dtype=None)
np.arange(0,10,2)
array([0, 2, 4, 6, 8])

7)利用np.random.
 a)np.random.randint(low, high=None, size=None, dtype='l')
np.random.randint(0,10,size=(3,4,5))
array([[[0, 0, 7, 3, 9],
        [3, 4, 2, 7, 9],
        [2, 6, 4, 0, 8],
        [8, 1, 8, 3, 5]],


       [[5, 5, 0, 3, 2],
        [8, 1, 3, 1, 5],
        [5, 4, 5, 4, 5],
        [1, 6, 9, 7, 0]],


      [[5, 9, 7, 3, 6],
        [7, 6, 1, 3, 0],
        [0, 3, 6, 7, 0],
        [7, 6, 8, 3, 3]]])
b)np.random.randn(d0, d1, ..., dn)
np.random.seed(0)
np.random.randn(10)
array([ 1.62434536, -0.61175641, -0.52817175, -1.07296862,  0.86540763,
       -2.3015387 ,  1.74481176, -0.7612069 ,  0.3190391 , -0.24937038])

c)np.random.random(size=None)
np.random.random(2)
array([ 0.97861834,  0.79915856])
二、ndarray的属性
4个必记参数: ndim:维度 shape:形状(各维度的长度) size:总长度
dtype:元素类型

三、ndarray的基本操作
1. 切片
一维与列表完全一致 多维时同理
np.random.seed(0)
x = np.random.randint(1,10,(3,4))
x
array([[6, 1, 4, 4],
       [8, 4, 6, 3],
       [5, 8, 7, 9]])

x[:2]
array([[6, 1, 4, 4],
       [8, 4, 6, 3]])

x[:,:-1]
array([[6, 1, 4],
       [8, 4, 6],
       [5, 8, 7]])

2. 变形
使用reshape函数,注意参数是一个tuple!
x=np.arange(1,10).reshape((3,3))
x
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

3. 级联
1)np.concatenate() 级联需要注意的点:
2)级联的参数是列表:一定要加中括号
3)维度必须相同
4)形状相符
【重点】级联的方向默认是shape这个tuple的第一个值所代表的维度方向
可通过axis参数改变级联的方向

z1=np.array([[1,2,3],[4,5,6]])
z1
array([[1, 2, 3],
       [4, 5, 6]])

y1=np.array([[7,8,9],[12,22,23]])
y1
array([[ 7,  8,  9],
       [12, 22, 23]])

np.concatenate([z1,y1],axis=1)  水平级联
array([[ 1,  2,  3,  7,  8,  9],
       [ 4,  5,  6, 12, 22, 23]])

np.concatenate([z1,y1])   默认为垂直级联
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [12, 22, 23]])


4切分:
np.split
np.vsplit
np.hsplit

x=np.arange(1,10)
x
x1,x2,x3=np.split(x,[3,5])
display(x1,x2,x3)
array([1, 2, 3])
array([4, 5])
array([6, 7, 8, 9])


np.vsplit()  垂直切分
x=x.reshape((3,3))
np.vsplit(x,[2])
[array([[1, 2, 3],
        [4, 5, 6]]), array([[7, 8, 9]])]

np.hsplit()
np.hsplit(x,[1,2])       [1,2]表示下标为在第1列之前切分一次,在第二列前切分一次
[array([[1],
        [4],
        [7]]), array([[2],
        [5],
        [8]]), array([[3],
        [6],
        [9]])]


5. 副本
所有赋值运算不会为ndarray的任何元素创建副本。对赋值后的对象的操作也对原来的对象生效。
1)直接赋值   类似于浅拷贝
a=np.array([1,2,3])
b=a
display(a,b)
array([1, 2, 3])
array([1, 2, 3])


b[0]=2
display(a,b)
array([2, 2, 3])
array([2, 2, 3])

2)可使用copy()函数创建副本   类似于深拷贝
c=a.copy()
c
array([2, 2, 3])
c[0]=3
display(a,c)
array([2, 2, 3])
array([3, 2, 3])


四、ndarray的聚合操作
1. 求和np.sum
np.random.seed(0)
a=np.random.random(2)
%timeit sum(a) / %timeit np.sum(a)

2. 最大最小值:np.max/ np.min
ma=max(a)
mi=min(a)
display(ma,mi)

3. 其他聚合操作
Function Name    NaN-safe Version    Description
np.sum    np.nansum    Compute sum of elements
np.prod    np.nanprod    Compute product of elements
np.mean    np.nanmean    Compute mean of elements
np.std    np.nanstd    Compute standard deviation
np.var    np.nanvar    Compute variance
np.min    np.nanmin    Find minimum value
np.max    np.nanmax    Find maximum value
np.argmin(返回最小值的下标,axis=0,以列为组)    np.nanargmin    Find index of minimum value
np.argmax (返回最大值的下标,axis=1,以行为组)   np.nanargmax    Find index of maximum value
np.median    np.nanmedian    Compute median of elements
np.percentile    np.nanpercentile    Compute rank-based statistics of elements
np.any    N/A    Evaluate whether any elements are true
np.all    N/A    Evaluate whether all elements are true

五、ndarray的矩阵操作

1. 基本矩阵操作
1) 算术运算符:
加减乘除 
a=np.array([[1,2,3],[4,5,6]])
a
array([[1, 2, 3],
       [4, 5, 6]])

a+1
array([[2, 3, 4],
       [5, 6, 7]])

a-1
array([[0, 1, 2],
       [3, 4, 5]])

a*2
array([[ 2,  4,  6],
       [ 8, 10, 12]])

a/2
array([[ 0.5,  1. ,  1.5],
       [ 2. ,  2.5,  3. ]])


2.矩阵积

b=np.arange(6).reshape((3,2))
b
array([[0, 1],
       [2, 3],
       [4, 5]])

b=np.ones((3,2),dtype=int)
b
Out[124]:
array([[1, 1],
       [1, 1],
       [1, 1]])

np.dot(a,b)
array([[ 6,  6],
       [15, 15]])


3.广播机制
原则:
1:为缺失元素补1
2:假定缺失元素用已有值填充

m=np.ones((2,3),dtype=int)
n=np.arange(3)
display(m,n)
array([[1, 1, 1],
       [1, 1, 1]])
array([0, 1, 2])

m+n
array([[1, 2, 3],
       [1, 2, 3]])

六、ndarray的排序
1:快速排序

np.sort()  :不改变原有输入值的顺序
ndarray.sort()本地处理,不占有呢村但改变原有输入值的顺序
np.random.seed(0)
a=np.random.randint(0,100,10)
a
array([44, 47, 64, 67, 67,  9, 83, 21, 36, 87])

np.sort(a)
array([ 9, 21, 36, 44, 47, 64, 67, 67, 83, 87])
a
array([44, 47, 64, 67, 67,  9, 83, 21, 36, 87])

ndarray.sort():::
a.sort()
a
array([ 9, 21, 36, 44, 47, 64, 67, 67, 83, 87])
a
array([ 9, 21, 36, 44, 47, 64, 67, 67, 83, 87])    #a的值已经发生变化,因此在数据处理过程中,尽量不对元数据做出改变,因此不建议使用这种方法

2. 部分排序

np.partition(a,k)
有的时候我们不是对全部数据感兴趣,我们可能只对最小或最大的一部分感兴趣。
当k为正时,我们想要得到最小的k个数
当k为负时,我们想要得到最大的k个数
a=np.random.randint(0,100,10)
a
array([70, 88, 88, 12, 58, 65, 39, 87, 46, 88])
np.partition(a,3)   #后面的参数为正数时,对将最小三个数放到前面
array([12, 39, 46, 58, 65, 70, 88, 87, 88, 88])
np.partition(a,-3)   #参数为负数时对最大的n位数进行排序
array([65, 58, 46, 12, 39, 70, 87, 88, 88, 88])

原创粉丝点击