数据分析之numpy

Numpy的使用

一:Numpy数组的创建

1) 使用np来生成一个有序的一维数组

ls1=np.arange(10)

ls1

输出:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

2)通过数组创建np数组

arr1=np.array([1,10,5,2,30,20])

arr1

输出:array([ 1, 10, 5, 2, 30, 20])

通过元组创建np数组
arr3=np.array(((1,1,1,1,2),(2,2,2,2,2)))

arr3

输出:array([[1, 1, 1, 1, 2], [2, 2, 2, 2, 2]])

4)创建空数组

np.empty(3)
输出:array([0., 0., 0.])
二:二维及多维数组的创建

二维数组的创建

1)元组套元组

arr3=np.array(((1,1,1,1,2),(2,2,2,2,2)))

arr3

输出:array([[1, 1, 1, 1, 2], [2, 2, 2, 2, 2]])

创建全一数组

np.ones(3)
输出:array([1., 1., 1.])
创建全零数组:

np.zeros(3)

输出:array([0., 0., 0.])
创建元素全为一的3*4的二维数组

np.ones([3,4]

输出:
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
创建元素全为零的3*4全零数组

np.zeros([3,4])

输出:array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
查看数组的形状:

arr.shape
查看数组的数据类型:

arr.dtype
将多维数组展开:

例:arr5=np.empty([3,4])

arr5

输出:array([[1.03156124e-311, 3.16202013e-322, 0.00000000e+000,
0.00000000e+000],

[0.00000000e+000, 9.68744731e-071, 1.69184165e-052,
8.77838469e-071],
[4.98778453e-037, 6.40440036e+170, 1.33532526e+165,
1.61997615e-051]])

对arr5数组展开,即降维

arr6=arr5.ravel()  #降维
arr6

输出:
array([1.03156124e-311, 3.16202013e-322, 0.00000000e+000, 0.00000000e+000,

0.00000000e+000, 9.68744731e-071, 1.69184165e-052, 8.77838469e-071,
4.98778453e-037, 6.40440036e+170, 1.33532526e+165, 1.61997615e-051])
使用flatten函数可以实现相同的效果

arr7=arr5.flatten()

arr7

输出:

array([1.03156124e-311, 3.16202013e-322, 0.00000000e+000, 0.00000000e+000,
0.00000000e+000, 9.68744731e-071, 1.69184165e-052, 8.77838469e-071,
4.98778453e-037, 6.40440036e+170, 1.33532526e+165, 1.61997615e-051])
返回数组的维数:

arr.ndim
返回数组中元素的个数

arr.size
返回数组转置的结果

arr.T

数组的级联

arr8=np.zeros([3,4])
arr9=np.ones([3,4])
水平级联

水平级联的行数必须相同

np.hstack((arr8,arr9))

输出:
    
    array([[0., 0., 0., 0., 1., 1., 1., 1.],

[0., 0., 0., 0., 1., 1., 1., 1.],
[0., 0., 0., 0., 1., 1., 1., 1.]])
纵向级联

纵向级联的列数必须相同

np.vstack((arr8,arr9))

输出:
    
    array([[0., 0., 0., 0.],

[0., 0., 0., 0.],
[0., 0., 0., 0.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])

水平连接:
与水平级联效果相同
np.column_stack((arr8,arr9))
输出:
array([[0., 0., 0., 0., 1., 1., 1., 1.],
[0., 0., 0., 0., 1., 1., 1., 1.],
[0., 0., 0., 0., 1., 1., 1., 1.]])

纵向连接:
    纵向连接与纵向级联的效果相同
    arr11=np.row_stack((arr8,arr9))
    arr11
    输出:
        array([[0., 0., 0., 0.],
               [0., 0., 0., 0.],
               [0., 0., 0., 0.],
               [1., 1., 1., 1.],
               [1., 1., 1., 1.],
               [1., 1., 1., 1.]])

形状重置:

arr12=arr11.reshape(4,6)
arr12

输出:
array([[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1.]])

使用reshape对形状的改变并不会影响原数组

如果想要改变原有数组的形状,可以使用resize()函数

arr11.resize(4,6)
arr11
输出:
array([[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1.]])
将ndArray数组转为list

data=arr11.tolist()

type(data)

输出:
list
data
输出:
[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[1.0, 1.0, 1.0, 1.0, 1.0, 1.0],
[1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
将list转为ndArray:

data1=np.array(data)

type(data1)
输出:
numpy.ndarray
data1
输出:
array([[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1.]])
数据类型转换:

arr11.astype(int)
输出:
array([[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1]])
数组元素的获取:

data2=np.array(np.arange(10))
data2
输出:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
以下标方式获取元素:
data2[3]
输出:
3
获取前三个元素
data2[:3]
输出:
array([0, 1, 2])
获取第四个元素后的所有元素
data2[3:]
输出:
array([3, 4, 5, 6, 7, 8, 9])

获取最后两位:
    data2[-2:]
    输出:
        array([8, 9])

步长为2取数
    data2[::2]
    输出:
        array([0, 2, 4, 6, 8])
建立一个3*4的数组
arr8=np.array(np.arange(12)).reshape(3,4)
arr8
输出:
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
#取前两行前两列的数据
arr8[:2,:2]
输出:
    array([[0, 1],
            [4, 5]])

获取第一行的数据
arr8[0]
输出:
    array([0, 1, 2, 3])
获取前两行前两列的数据
arr8[:2,:2]
输出:
    array([[0, 1],
        [4, 5]])
        
获取第一行与第三行
arr8[[0,2]]
输出:
    array([[ 0,  1,  2,  3],
            [ 8,  9, 10, 11]])


获取所有行的第一列
    arr8[:,0]
    输出:
        array([0, 4, 8])
获取所有行最后两列
    arr8[:,-2:]
    输出:
        array([[ 2,  3],
               [ 6,  7],
               [10, 11]])
               
               
获取所有行的第一列和第三列的数据

    arr8[:,[0,2]]
    输出:
        array([[ 0,  2],
               [ 4,  6],
               [ 8, 10]])
               
获取第二行第三列的数据    
    
    arr8[1,2]
    
    输出:6

布尔索引:

log=np.array([True,False,False,True,True,False])
arr9=np.array(np.arange(24)).reshape(6,4)
arr9
输出:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]])
获取所有为true的对应的行

arr9[log]

输出:
array([[ 0, 1, 2, 3],
[12, 13, 14, 15],
[16, 17, 18, 19]])
返回所有为False对应的行

arr9[~log]

输出:
array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[20, 21, 22, 23]])

案例:
生成一个包含有七个元素的一维数组
area=np.array(['A','B','A','C','A','B','D'])
area
输出:
array(['A', 'B', 'A', 'C', 'A', 'B', 'D'], dtype='<U1')
生成一个7*3的二维数组

observes=np.array(np.arange(21)).reshape(7,3)
observes
输出:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17],
[18, 19, 20]])
在area中,A出现的索引位置为0,2,4,通过A的索引获取observes对应索引行的数据:

observes[area=='A']
输出:
array([[ 0, 1, 2],
[ 6, 7, 8],
[12, 13, 14]])
通过c在area中的索引位置来获取observes对应行的数据

observes[area=='C']

    输出:
        array([[ 9, 10, 11]])

通过a和d在area中的索引位置来获取observes对应行的数据

observes[(area'A') |(area'D')]
输出:
array([[ 0, 1, 2],
[ 6, 7, 8],
[12, 13, 14],
[18, 19, 20]])

返回A区域的所有行,且只获取第1列与第3列数据

observes[area=='A'][:,[0,2]]
输出:
array([[ 0, 2],
[ 6, 8],
[12, 14]])
花式索引:

实际上就是将数组作为索引将原数组的元素提取出来

arr10=np.arange(1,29).reshape(7,4)
arr10
输出:
    array([[ 1,  2,  3,  4],
           [ 5,  6,  7,  8],
           [ 9, 10, 11, 12],
           [13, 14, 15, 16],
           [17, 18, 19, 20],
           [21, 22, 23, 24],
           [25, 26, 27, 28]])

将第二行,第四行,第六行,第七行数据返回
arr10[1,3,5,6]
输出:
array([[ 5, 6, 7, 8],
[13, 14, 15, 16],
[21, 22, 23, 24],
[25, 26, 27, 28]])
返回第二行第三行对应的第二列与第三列:

arr10[[1,2]][:,[1,2]]
输出:
array([[ 6, 7],
[10, 11]])
如果想使用比较简单的方式返回指定行以列的二维数组的话,可以使用ix_()函数

返回第一行後三行,第四行的第一列第四列与第二列

    arr10[np.ix_([0,2,3],[0,3,2])]
    
    输出:
        array([[ 1,  4,  3],
               [ 9, 12, 11],
               [13, 16, 15]])

统计函数与线性代数运算

统计运算中常见的聚合函数有:最小值、最大值、中位数、均值、方差、标准差等。首先来看看数组元素级别的计算:

 arr11=5-np.arange(1,13).reshape(4,3)
 arr11
 
 输出:
    array([[ 4,  3,  2],
           [ 1,  0, -1],
           [-2, -3, -4],
           [-5, -6, -7]])
           
arr12=np.random.randint(1,10,size=12).reshape(4,3)
arr12
输出:
    array([[9, 7, 2],
           [1, 1, 8],
           [7, 8, 8],
           [2, 8, 9]])
           
arr13=arr11**2
arr13
输出:
    array([[4., 3., 2.],
           [1., 0., 1.],
           [2., 3., 4.],
           [5., 6., 7.]])

#计算arr13中每个元素的平方根
np.sqrt(arr13)
输出:
    array([[4., 3., 2.],
           [1., 0., 1.],
           [2., 3., 4.],
           [5., 6., 7.]])

计算arr13中每个元素的指数值

    np.exp(arr13)
    
    输出:
        array([[8.88611052e+06, 8.10308393e+03, 5.45981500e+01],
               [2.71828183e+00, 1.00000000e+00, 2.71828183e+00],
               [5.45981500e+01, 8.10308393e+03, 8.88611052e+06],
               [7.20048993e+10, 4.31123155e+15, 1.90734657e+21]])

计算arr13中每个元素的自然对数值
np.log(arr13)

输出:
      array([[2.77258872, 2.19722458, 1.38629436],
       [0.        ,       -inf, 0.        ],
       [1.38629436, 2.19722458, 2.77258872],
       [3.21887582, 3.58351894, 3.8918203 ]])

计算每个元素的绝对值

np.abs(arr13)

整除

arr11//2

输出:
    array([[ 2,  1,  1],
           [ 0,  0, -1],
           [-1, -2, -2],
           [-3, -3, -4]], dtype=int32)

取余数

arr11%3
输出:
    array([[1, 0, 2],
           [1, 0, 2],
           [1, 0, 2],
           [1, 0, 2]], dtype=int32)

统计运算函数

计算所有元素之和
np.sum(arr11)
输出:
-18
对每一列求和

np.sum(arr11,axis=0)

输出:
    array([ -2,  -6, -10])

形状相同的数组间元素操作

arr11+arr12
输出:
array([[ 6, 9, 4],
[ 7, 5, 7],
[ 1, 6, 3],
[ 2, 0, -4]])

arr11*arr12

输出:
array([[ 8, 18, 4],
[ 6, 0, -8],
[ -6, -27, -28],
[-35, -36, -21]])

整除

arr11//arr12
输出:
    array([[ 2,  0,  1],
           [ 0,  0, -1],
           [-1, -1, -1],
           [-1, -1, -3]], dtype=int32)

除arr11/arr12

arr11/arr12

输出:    
    array([[ 2.        ,  0.5       ,  1.        ],
   [ 0.16666667,  0.        , -0.125     ],
   [-0.66666667, -0.33333333, -0.57142857],
   [-0.71428571, -1.        , -2.33333333]])

取余

arr11%arr12

输出:
    array([[0, 3, 0],
           [1, 0, 7],
           [1, 6, 3],
           [2, 0, 2]], dtype=int32)

对所有元素求和
np.sum(arr11)

输出:
    -18

对每一列求和

np.sum(arr11,axis=0)
输出:
array([ -2, -6, -10])
对每一行求和

np.sum(arr11,axis=1)
输出:
array([ 9, 0, -9, -18])
求每一列的累积和,并返回二维数组

np.cumsum(arr11,axis=0)
输出:
array([[ 4, 3, 2],
[ 5, 3, 1],
[ 3, 0, -3],
[ -2, -6, -10]], dtype=int32)
计算每一列的累计积

np.cumprod(arr11,axis=1)
输出:
array([[ 4, 12, 24],
[ 1, 0, 0],
[ -2, 6, -24],
[ -5, 30, -210]], dtype=int32)
计算所有元素中的最小值

np.min(arr11)

输出:

-7

计算所有元素中的最大值
np.max(arr11)

输出:
    4

计算每一列的最大值

np.max(arr11,axis=0)

输出:
array([4, 3, 2])
计算每一行的最大值

np.max(arr11,axis=1)
输出:
array([ 4, 1, -2, -5])
计算所有元素的平均值

np.mean(arr11)
计算每一列的均值

np.mean(arr11,axis=0)
计算每一行的均值

np.mean(arr11,axis=1)
计算所有元素的中位数

np.median(arr11)
计算所有元素方差

np.var(arr11)
np.where

np.where(condition, x, y)

满足条件(condition),输出x,不满足输出y。
arr11
输出:
array([[ 4, 3, 2],
[ 1, 0, -1],
[-2, -3, -4],
[-5, -6, -7]])
np.where(arr11<0,'小于零','大于零')
输出:
array([['大于零', '大于零', '大于零'],
['大于零', '大于零', '小于零'],
['小于零', '小于零', '小于零'],
['小于零', '小于零', '小于零']], dtype='<U3')
np.where(condition):

只有条件 (condition),没有x和y,则输出满足条件 (即非0) 元素的坐标 (等价于numpy.nonzero)。这里的坐标以tuple的形式给出, #通常原数组有多少维,输出的tuple中就包含几个数组,分别对应符合条件元素的各维坐标。

a=np.array([2,4,6,8,10])
返回a中大于5的元素索引
np.where(a>5)
输出:
(array([2, 3, 4], dtype=int64),)
返回a中大于5的元素
a[np.where(a>5)]
输出:
array([ 6, 8, 10])
其它函数:

np.unique( )的用法 该函数是去除数组中的重复数字,并进行排序之后输出。
np.unique([1,1,2,3,4])

输出:
array([1, 2, 3, 4])
intersect1d(x,y):计算x和y的公共元素,即交集

x=np.array([1,2,3,4,5]) y=np.array([4,5,6,7,8]) 取x,y的交集 np.intersect1d(x,y)

输出:array([4, 5])
union1d(x,y):计算x和y的并集

np.union1d(x,y)
输出:
array([1, 2, 3, 4, 5, 6, 7, 8])
setdiff1d(x,y):计算x和y的差集,即元素在x中,不在y中

np.setdiff1d(x,y)
输出:
array([1, 2, 3])
setxor1d(x,y):计算集合的对称差,即存在于一个数组中,但不同时存在于两个数组中

np.setxor1d(x,y)
输出:
array([1, 2, 3, 6, 7, 8])
in1d(x,y):判断x的元素是否包含于y中

np.inld(x,y)
输出:
array([False, False, False, True, True])
找出x在y中的元素

x[np.inld(x,y)]
输出:
array([4, 5])

posted @ 2019-10-12 17:40  雪纷飞  阅读(212)  评论(0编辑  收藏  举报