前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据分析利器-NumPy

数据分析利器-NumPy

作者头像
吕海峰
发布2018-04-03 15:03:15
1.1K0
发布2018-04-03 15:03:15
举报
文章被收录于专栏:Brian

概述

NumPy类库是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多。它里面含有大量的数学和科学计算的工具包。对于数据处理和分析来说是非常的高效。

NumPy

numpy最主要的对象ndarray,是一个n维的数组结构,存储的是同构数据集。dtype表示多维数组的类型,shape是多维数组的维度,表示每个维度的大小。ndim表示维度的秩,也是维度的数量。size多维数组元素个数即维度的乘积。在介绍NumPy之前,我们需要安装numpy。

代码语言:javascript
复制
#Debian、Ubuntu
sudo apt-get install python-numpy
#centos
sudo yum install numpy scipy
#或者基于pip包管理工具进行安装
sudo pip install numpy

基本语法

安装完成之后,我们需要先导入numpy包才可以用numpy。

代码语言:javascript
复制
ipython
In [17]: a=np.array([[1,2,3],[4,5,6]])
In [18]: a.dtype
Out[18]: dtype('int64')
In [19]: a.ndim
Out[19]: 2
In [20]: a.size
Out[20]: 6
In [21]: type(a)
Out[21]: numpy.ndarray
In [22]: a.shape
Out[22]: (2, 3)
#itemsize代表该多维数组结构元素的大小,即一个元素按照几个字节存储。该a多维数组中,每个元素占用8个字节。
In [23]: a.itemsize
Out[23]: 8
#data返回的是一个缓冲区对象,即右值或者切片的缓冲区对象。
In [24]: a.data
Out[24]: <read-write buffer for 0x10553e4e0, size 48, offset 0 at 0x105576df0>
```                     
np.array()接收的是一个序列对象,返回一个多维数组结构。其中可选参数dtype可以指定类型。比如:
```python
In [38]: b=np.array([['a', 'b'],['c', 'd']])
In [39]: b
Out[39]:
array([['a', 'b'],
       ['c', 'd']],
      dtype='|S1')
In [40]: c=np.array(((1,2,3),(4,5,6)),dtype=complex)
In [41]: c
Out[41]:
array([[ 1.+0.j,  2.+0.j,  3.+0.j],
       [ 4.+0.j,  5.+0.j,  6.+0.j]])
```                                  
numpy还有集成的创建0、1多维数组和一些方法,比如:ones、zeros、arange、reshape、random和linespace等。
```python
In [42]: d=np.zeros((2,3))
In [43]: e=np.ones((2,3))
In [44]: f=np.arange(1,10,2)
In [46]: d
Out[46]:
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])

In [47]: f
Out[47]: array([1, 3, 5, 7, 9])
In [48]: e
Out[48]:
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])
#先创建16个元素的一维数组,然后通过调用reshape重现生成了一个4x4多维数组。
In [50]: np.arange(0,16).reshape((4,4))
Out[50]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
#创建了一个一维数组,然后按照线性分割我们需要的5个元素。
In [51]: np.linspace(0,10,5)
Out[51]: array([  0. ,   2.5,   5. ,   7.5,  10. ])
#创建多个随机数
In [57]: np.random.random(10)
Out[57]:
array([ 0.02138562,  0.94779289,  0.23206002,  0.86276725,  0.08900668,
        0.9792112 ,  0.21540098,  0.87322897,  0.13778929,  0.63568084])

基本算数操作

numpy可以进行加减乘除操作,所操作的对象是对应位置的元素。例如:

代码语言:javascript
复制
In [82]: a = np.arange(0, 9).reshape(3, 3)
In [83]: b = np.ones((3,3))
In [84]: a
Out[84]:
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
In [85]: b
Out[85]:
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])
In [86]: a+b
Out[86]:
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.],
       [ 7.,  8.,  9.]])
In [87]: a*b
Out[87]:
array([[ 0.,  1.,  2.],
       [ 3.,  4.,  5.],
       [ 6.,  7.,  8.]])
In [88]: a.dot(b)
Out[88]:
array([[  3.,   3.,   3.],
       [ 12.,  12.,  12.],
       [ 21.,  21.,  21.]])

其中dot多维数组的点积,例如:

a.dot(b)=\sum_{i=1}^n a_i*b_i

ufunc和aggregate函数

log,sin,sqrt等等都已封装在numpy类库中,他们所操作的对象是多维数组中单个元素。而对于max,min,std是对整个多维数组操作的。

代码语言:javascript
复制
In [90]: a=np.arange(10)
In [91]: np.sqrt(a)
Out[91]:
array([ 1.        ,  1.41421356,  1.73205081,  2.        ,  2.23606798,
        2.44948974,  2.64575131,  2.82842712,  3.        ])
In [92]: a
Out[92]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])
In [93]: a.min()
Out[93]: 1
In [94]: a.max()
Out[94]: 9
In [95]: a.std()
Out[95]: 2.5819888974716112
In [96]: a.cov()

切片

我们先看一下图片:

代码语言:javascript
复制
#对于一维数组
In [100]: a=np.arange(10,16)
In [101]: a
Out[101]: array([10, 11, 12, 13, 14, 15])
#指定索引
In [102]: a[1]
Out[102]: 11
#从索引0开始到索引2且不包括索引2
In [103]: a[:2]
Out[103]: array([10, 11])
In [104]: a[2:]
Out[104]: array([12, 13, 14, 15])
In [105]: a[:-1]
Out[105]: array([10, 11, 12, 13, 14])
#倒着选取元素
In [107]: a[::-1]
Out[107]: array([15, 14, 13, 12, 11, 10])
#指定多个索引
In [108]: a[[1,3,4]]
Out[108]: array([11, 13, 14])
#间隔两个元素
In [109]: a[::2]
Out[109]: array([10, 12, 14])
#从索引0开始到索引4且不包括索引4,间隔两个元素。
In [110]: a[:4:2]
Out[110]: array([10, 12])
#对于多维数组
a = np.arange(10, 19).reshape((3, 3))
n [127]: a
Out[127]:
array([[10, 11, 12],
       [13, 14, 15],
       [16, 17, 18]])
#行,列。选取第2行的所有列。
In [128]: a[1,:]
Out[128]: array([13, 14, 15])
In [129]: a[:,0]
Out[129]: array([10, 13, 16])
In [130]: a[0:2, 0:2]
Out[130]:
array([[10, 11],
       [13, 14]])
In [131]: a[[0,2], [0,2]]
Out[131]: array([10, 18])
##遍历
In [136]: b
Out[136]: array([10, 11, 12, 13, 14, 15, 16, 17, 18])
In [137]: for item in b:
     ...:     print item
     ...:
10
11
12
13
14
15
16
17
18
In [138]: for row in a:
     ...:     print row
[10 11 12]
[13 14 15]
[16 17 18]
In [140]: for item in a.flat:
     ...:     print item
     ...:
10
11
12
13
14
15
16
17
18

聚合函数方法

如果你想使用聚合函数返回一列或者一行的数据,可以使用apply_along_axis(func1d,axis,array)。比如我们想求多维数组的平均值和最大值。

代码语言:javascript
复制
In [10]: a=np.arange(10,19).reshape((3,3))

In [11]: a
Out[11]:
array([[10, 11, 12],
       [13, 14, 15],
       [16, 17, 18]])
#axis=0指定了按列进行求平均值
In [12]: np.apply_along_axis(np.mean,axis=0,arr=a)
Out[12]: array([ 13.,  14.,  15.])
#axis=1按照行进行求平均值
In [13]: np.apply_along_axis(np.mean,axis=1,arr=a)
Out[13]: array([ 11.,  14.,  17.])

当然func1d也可以指定自定义函数,比如:

代码语言:javascript
复制
In [18]: def test(x):
		  		return x*2+x
In [19]: np.apply_along_axis(test,axis=0,arr=a)
Out[19]:
array([[30, 33, 36],
       [39, 42, 45],
       [48, 51, 54]])

条件筛选

numpy条件的筛选很多种,比如bool的筛选或者采用where等。

代码语言:javascript
复制
In [43]: a[a>12]
Out[43]: array([13, 14, 15, 16, 17, 18])
#如果你想a>12的重新赋值为13,否则赋值为1.
In [48]: np.where(a>12,10,1)
Out[48]:
array([[ 1,  1,  1],
       [10, 10, 10],
       [10, 10, 10]])

多位数组变换

多维数组的变换包括维度的变换、线性代数基本的变换。

代码语言:javascript
复制
In [70]: a
Out[70]:
array([[10, 11, 12],
       [13, 14, 15],
       [16, 17, 18]])

In [71]: a.shape=(1,9)
In [72]: a
Out[72]: array([[10, 11, 12, 13, 14, 15, 16, 17, 18]])
In [73]: a.shape=(3,3)
In [74]: a
Out[74]:
array([[10, 11, 12],
       [13, 14, 15],
       [16, 17, 18]])
#将多维数组转换为1维的数组结构
In [75]: a.ravel()
Out[75]: array([10, 11, 12, 13, 14, 15, 16, 17, 18])
#数组转置
In [86]: a.transpose()
Out[86]:
array([[10],
       [11],
       [12],
       [13],
       [14],
       [15],
       [16],
       [17],
       [18]])

数组的叠加和分割

多维数组的叠加有按照垂直vstack(按照行叠加)和水平方向hstack按照列叠加进行叠加到一个数组里面。

代码语言:javascript
复制
In [95]: a
Out[95]:
array([[ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.]])

In [96]: b
Out[96]:
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])

In [97]: np.vstack((a,b))
Out[97]:
array([[ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])

In [98]: np.hstack((a,b))
Out[98]:
array([[ 1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.]])

numpy还提供了column_stackrow_stack两个方法作用于在多个一维的数组,生成一个新的两维的数组。 numpy不仅提供了数组的叠加还有提供了数组的分割,也是按照水平和垂直方向来进行分割。所提供的方法是hsplit、vsplit和split

总结

numpy非常高效并且提供了很多函数和操作,需要在项目中不断积累。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • NumPy
    • 基本语法
      • 基本算数操作
        • ufunc和aggregate函数
          • 切片
            • 聚合函数方法
              • 条件筛选
                • 多位数组变换
                  • 数组的叠加和分割
                  • 总结
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档