Numpy--利用python做数据分析

Numpy简介

下面的展示方式可能不一样 有在ipython环境下和Jupyter环境下(选择工作中常用的分享)

NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(通常是元素是数字)。在NumPy中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank)。

一种多维数组对象 ndarray

NumPy的数组类被称作ndarray。通常被称作数组。注意numpy.array和标准Python库类array.array并不相同,后者只处理一维数组和提供少量功能。常用的属性如下:

  
  
  
  1. In [10]: np.arange(16).reshape((4,4))

  2. Out[10]:

  3. array([[ 0,  1,  2,  3],

  4.       [ 4,  5,  6,  7],

  5.       [ 8,  9, 10, 11],

  6.       [12, 13, 14, 15]])

  7. In [11]: type(np.arange(16).reshape((4,4)))

  8. Out[11]: numpy.ndarray

  9. data=np.arange(16).reshape((4,4))

  10. data.dtype  

  11. #dtype('int32')

  12. data.shape

  13. #(4, 4)

  14. data.size

  15. #16

创建ndarray

有好几种创建数组的方法,常用array函数从常规的Python列表和元组创造数组。所创建的数组类型由原序列中的元素类型推导而来。

  
  
  
  1. In [8]: np.array([1,2,3,4,5])

  2. Out[8]: array([1, 2, 3, 4, 5])

  3. In [7]: np.array([[1,2,3,4,5,6],[1,2,3,4,5,6]])

  4. Out[7]:

  5. array([[1, 2, 3, 4, 5, 6],

  6.       [1, 2, 3, 4, 5, 6]])

  7. In [14]: np.array([(1,2,3,4,5,6),[1,2,3,4,5,6]])

  8. Out[14]:

  9. array([[1, 2, 3, 4, 5, 6],

  10.       [1, 2, 3, 4, 5, 6]])

  11. In [16]: np.array(((1,2,3,4,3,6),(1,2,3,4,5,6)))

  12. Out[16]:

  13. array([[1, 2, 3, 4, 3, 6],

  14.       [1, 2, 3, 4, 5, 6]])

  15. #指定类型

  16. In [17]: np.array(((1,2,3,4,3,6),(1,2,3,4,5,6)),dtype=float)

  17. Out[17]:

  18. array([[ 1.,  2.,  3.,  4.,  3.,  6.],

  19.       [ 1.,  2.,  3.,  4.,  5.,  6.]])

numpy常用的函数

  • ones创建一个全1的数组

  • zeros 创建一个全0的数组

  • empty创建一个内容随机并且依赖与内存状态的数组

  • arange 为了创建一个数列的函数,返回数组而不是列表:

  
  
  
  1. In [20]: np.ones((2,3))

  2. Out[20]:

  3. array([[ 1.,  1.,  1.],

  4.       [ 1.,  1.,  1.]])

  5. In [21]: np.zeros((2,3))

  6. Out[21]:

  7. array([[ 0.,  0.,  0.],

  8.       [ 0.,  0.,  0.]])

  9. #一维数组被打印成行,二维数组成矩阵,三维数组成矩阵列表。      

  10. In [24]: np.arange(6)

  11. Out[24]: array([0, 1, 2, 3, 4, 5])

  12. In [27]: np.arange(12).reshape(2,6)

  13. Out[27]:

  14. array([[ 0,  1,  2,  3,  4,  5],

  15.       [ 6,  7,  8,  9, 10, 11]])

  16. In [29]: np.arange(12).reshape(3,2,2)

  17. Out[29]:

  18. array([[[ 0,  1],

  19.        [ 2,  3]],

  20.       [[ 4,  5],

  21.        [ 6,  7]],

  22.       [[ 8,  9],

  23.        [10, 11]]])

  24. #如果一个数组用来打印太大了,NumPy自动省略中间部分而只打印角落

  25. In [31]: np.arange(100000)

  26. Out[31]: array([    0,     1,     2, ..., 99997, 99998, 99999])

  27. # 禁用NumPy的这种行为并强制打印整个数组,你可以设置 printoptions参数来更改打印选项。

基本运算

数组的算术运算是按元素的。新的数组被创建并且被结果填充。

  
  
  
  1. data1=np.arange(10)

  2. data2=np.arange(10)

  3. data1*data2

  4. #array([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81])

不像许多矩阵语言,NumPy中的乘法运算符*指示按元素计算,矩阵乘法可以使用dot函数或创建矩阵对象实现

  
  
  
  1. np.dot(data1,data2)

  2. #285

有些操作符像 +=和 *=被用来更改已存在数组而不创建一个新的数组。

  
  
  
  1. data=np.ones(15)

  2. data

  3. #out

  4. array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,

  5.        1.,  1.])

  6. data*=2

  7. #out

  8. array([ 2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,

  9.        2.,  2.])

运算指定 axis参数你可以吧运算应用到数组指定的轴上

  
  
  
  1. data=np.arange(18).reshape((3,6))

  2. data

  3. array([[ 0,  1,  2,  3,  4,  5],

  4.       [ 6,  7,  8,  9, 10, 11],

  5.       [12, 13, 14, 15, 16, 17]])

  6. data.sum(axis=0)

  7. array([18, 21, 24, 27, 30, 33])

  8. data.sum(axis=1)

  9. array([15, 51, 87])

索引,切片和迭代

一维数组可以被索引、切片和迭代,就像列表和其它Python序列。
多维数组可以每个轴有一个索引,这些索引由一个逗号分割的元组给出。
当少于轴数的索引被提供时,确失的索引被认为是整个切片: 索引切片是原数据的视图,修改的话会对原数据造成影响 需要得到副本数据的话,加copy()

  
  
  
  1. data=np.arange(18).reshape((3,6))

  2. data

  3. array([[ 0,  1,  2,  3,  4,  5],

  4.       [ 6,  7,  8,  9, 10, 11],

  5.       [12, 13, 14, 15, 16, 17]])

  6. data[1:3,3:]

  7. array([[ 9, 10, 11],

  8.       [15, 16, 17]])

  9. #如果一个人想对每个数组中元素进行运算,我们可以使用flat属性,该属性是数组元素的一个迭代器

  10. for i in data.flat:

  11.    print(i)

  12. data[1:3,3:]=12

  13. data

  14. array([[ 0,  1,  2,  3,  4,  5],

  15.       [ 6,  7,  8, 12, 12, 12],

  16.       [12, 13, 14, 12, 12, 12]])

  17. data=data[1:3,3:].copy()

布尔型索引

  
  
  
  1. names=np.array(['bob','les','lee','leslee','sally','silly','alis'])

  2. data=np.random.randn(7,4)

  3. data

  4. array([[-1.13573027, -0.68479345,  0.59825133,  1.78172432],

  5.       [-1.1516828 ,  0.89823945, -0.12296042,  0.12370584],

  6.       [ 1.42724922,  0.84648497, -0.6145136 , -1.92440901],

  7.       [ 0.8897498 , -0.13524427, -0.13473049,  0.22418047],

  8.       [-0.12076329, -0.71757068,  0.22619757, -0.31316627],

  9.       [ 0.13114028,  1.00729055, -0.3865038 ,  1.00018106],

  10.       [ 0.18532823, -1.00441648, -1.04649557, -1.16575243]])

  11. #每个名字对呀data数组中的一行 选出name等于lee的行

  12. names=='lee'

  13. array([False,  True,  True, False, False, False, False], dtype=bool)

  14. data[names=='lee']

  15. array([[-1.1516828 ,  0.89823945, -0.12296042,  0.12370584],

  16.       [ 1.42724922,  0.84648497, -0.6145136 , -1.92440901]])

  17. data[names=='lee',2:]

  18. array([[-0.12296042,  0.12370584],

  19.       [-0.6145136 , -1.92440901]])

  20. data[names!='lee',2:]

  21. array([[-0.12296042,  0.12370584],

  22.       [-0.6145136 , -1.92440901]])

  23. data[(names=='lee')|(names=='bob'),2:]

  24. array([[ 0.59825133,  1.78172432],

  25.       [-0.12296042,  0.12370584],

  26.       [-0.6145136 , -1.92440901]])

  27. data[(names=='lee')&(names=='bob'),2:]

  28. array([], shape=(0, 2), dtype=float64)

  29. # and or 在布尔型数组中无效

  30. data[data>0]

  31. array([ 0.59825133,  1.78172432,  0.89823945,  0.12370584,  1.42724922,

  32.        0.84648497,  0.8897498 ,  0.22418047,  0.22619757,  0.13114028,

  33.        1.00729055,  1.00018106,  0.18532823])

  34. data[names!='bob']=7        

花式索引

  
  
  
  1. data=np.empty((4,4))

  2. data

  3. array([[  6.23042070e-307,   3.56043053e-307,   1.60219306e-306,

  4.          2.44763557e-307],

  5.       [  1.69119330e-306,   1.78022342e-306,   1.05700345e-307,

  6.          1.11261027e-306],

  7.       [  1.11261502e-306,   1.42410839e-306,   7.56597770e-307,

  8.          6.23059726e-307],

  9.       [  8.90104239e-307,   6.89804133e-307,   1.69118923e-306,

  10.          8.45593934e-307]])

  11. data[[1,2,3]]

  12. array([[  1.69119330e-306,   1.78022342e-306,   1.05700345e-307,

  13.          1.11261027e-306],

  14.       [  1.11261502e-306,   1.42410839e-306,   7.56597770e-307,

  15.          6.23059726e-307],

  16.       [  8.90104239e-307,   6.89804133e-307,   1.69118923e-306,

  17.          8.45593934e-307]])

  18. #选取其中的2,3,4行,默认从0开始

  19. #np.ix_将两个以为数组转化为方形区域的索引器

  20. data[np.ix_([1,2,3],[0,1,2])]

  21. array([[  1.69119330e-306,   1.78022342e-306,   1.05700345e-307],

  22.       [  1.11261502e-306,   1.42410839e-306,   7.56597770e-307],

  23.       [  8.90104239e-307,   6.89804133e-307,   1.69118923e-306]])

利用数组进行数据处理

  
  
  
  1. np.arange(1,10,0.01)

  2. array([ 1.  ,  1.01,  1.02,  1.03,  1.04,  1.05,  1.06,  1.07,  1.08,

  3.        1.09,  1.1 ,  1.11,  1.12,  1.13,  1.14,  1.15,  1.16,  1.17,

  4.        1.18,  1.19,  1.2 ,  1.21,  1.22,  1.23,  1.24,  1.25,  1.26,

  5.        1.27,  1.28,  1.29,  1.3 ,  1.31,  1.32,  1.33,  1.34,  1.35,

  6.        1.36,  1.37,  1.38,  1.39,  1.4 ,  1.41,  1.42,  1.43,  1.44,

  7.        1.45,  1.46,  1.47,  1.48,  1.49,  1.5 ,  1.51,  1.52,  1.53,

  8.        1.54,  1.55,  1.56,  1.57,  1.58,  1.59,  1.6 ,  1.61,  1.62,

  9.        1.63,  1.64,  1.65,  1.66,  1.67,  1.68,  1.69,  1.7 ,  1.71,

  10.        1.72,  1.73,  1.74,  1.75,  1.76,  1.77,  1.78,  1.79,  1.8 ,

  11.        1.81,  1.82,  1.83,  1.84,  1.85,  1.86,  1.87,  1.88,  1.89,

  12.        1.9 ,  1.91,  1.92,  1.93,  1.94,  1.95,  1.96,  1.97,  1.98,  1.99])

  13. np.where 函数是三元表达式 x if condition else y的矢量化版本

  14. result = np.where(cond,xarr,yarr)

  15. 当符合条件时是x,不符合是y,常用于根据一个数组产生另一个新的数组。

  16. 栗子:假设有一个随机数生成的矩阵,希望将所有正值替换为2,负值替换为-2

  17. arr = np.random.randn(4,4)

  18. arr

  19. np.where(arr>0,2,-2)        

  20. #numpy中有一些常用的用来产生随机数的函数,randn就是其中一个 numpy.random.randn(d0, d1, ..., dn)

  21. #d0, d1, …, dn都应该是整数,是浮点数也没关系,系统会自动把浮点数的整数部分截取出来。d0, d1, …, dn:应该为正整数,表示维度

  22. arr = np.random.randn(4,4)

  23. arr

  24. Out[51]:

  25. array([[ 0.04150406,  1.27790573, -0.25917274, -1.25604622],

  26.       [ 0.8797799 ,  1.84828821, -1.21709272, -0.41767649],

  27.       [-0.71758894, -0.70595454,  1.72330333,  0.18559916],

  28.       [-2.19529605,  2.11615947, -0.13563148, -1.41532576]])

  29. np.where(arr>0,2,-2)

  30. Out[52]:

  31. array([[ 2,  2, -2, -2],

  32.       [ 2,  2, -2, -2],

  33.       [-2, -2,  2,  2],

  34.       [-2,  2, -2, -2]])

  35. np.where(cond1&cond2,0,np.where(cond1,1,np.where(cond2,2,3)))

  36. #等价于

  37. if cond1 and cond2:

  38.   0

  39. elif cond1:

  40.   1

  41. elif cond2:

  42.   2

  43. else:

  44.  3

数学和统计方法

  
  
  
  1. data=np.random.randn(5,4)

  2. data

  3. array([[-0.44582163, -1.84127166, -0.31569774,  1.36470645],

  4.       [-0.11506653, -1.03561913, -0.97670808, -1.05951855],

  5.       [-1.24155893, -0.99854379, -0.77521176,  0.96576693],

  6.       [-0.07880383, -1.05389831, -0.98544118,  0.347693  ],

  7.       [ 0.50354977,  1.30615654, -0.39931607,  0.99116404]])

  8. data.sum()#矩阵求和

  9. data.sum(axis=0)#列求和

  10. data.sum(axis=1)#行求和

  11. #其他函数功能就不列举了,自行查询

  12. #布尔型数组的求和方法

  13. (data>0).sum()

  14. data=np.random.randn(5,4)

  15. (data>0).sum(axis=1)

  16. array([2, 3, 3, 3, 2])

  17. #排序 sort

  18. data.sort(axis=1)

  19. data

  20. array([[-1.84127166, -0.44582163, -0.31569774,  1.36470645],

  21.       [-1.05951855, -1.03561913, -0.97670808, -0.11506653],

  22.       [-1.24155893, -0.99854379, -0.77521176,  0.96576693],

  23.       [-1.05389831, -0.98544118, -0.07880383,  0.347693  ],

  24.       [-0.39931607,  0.50354977,  0.99116404,  1.30615654]])

唯一化及常用集合逻辑

  
  
  
  1. data=np.array(['lee','les','bob','hello','hello'])

  2. np.unique(data)

  3. array(['bob', 'hello', 'lee', 'les'],

  4.      dtype='<U5')

  5. value=np.array([1,2,3,4,5,6,7,8,])  

  6. #判断in1d(x,y)判断x是否在y中

  7. np.in1d(value,[1,2,3,4,5])

  8. array([ True,  True,  True,  True,  True, False, False, False], dtype=bool)

  9. value[np.in1d(value,[1,2,3,4,5])]

  10. array([1, 2, 3, 4, 5])


本文分享自微信公众号 - 我爱问读书(wawds_)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章