首页 > 编程语言 > 详细

重温《利用Python进行数据分析》-第4章-2

时间:2019-06-30 16:34:32      阅读:103      评论:0      收藏:0      [点我收藏+]

数组很重要,因为它使你不用编写循环即可对数据执行批量运算。这通常叫做矢量化。

大小相等的数组之间的任何算术运算都会将运算应用到元素级:

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

In [39]: arr
Out[39]:
array([[1., 2., 3.],
       [4., 5., 6.]])

In [40]: arr*arr
Out[40]:
array([[ 1.,  4.,  9.],
       [16., 25., 36.]])

In [41]: arr-arr
Out[41]:
array([[0., 0., 0.],
       [0., 0., 0.]])

  同样,数组与标量的算术运算也会将那个标量值传播到各个元素:

In [44]: 1/arr
Out[44]:
array([[1.        , 0.5       , 0.33333333],
       [0.25      , 0.2       , 0.16666667]])

In [45]: arr**0.5
Out[45]:
array([[1.        , 1.41421356, 1.73205081],
       [2.        , 2.23606798, 2.44948974]])

 不同大小的数组之间的运算叫做广播 

基本的索引和切片


Numpy数组的索引使一个内容丰富的主题,因为选区数据子集或单个元素的方式有很多种

 

In [7]: arr
Out[7]: array([ 0,  1,  2,  3,  4, 12, 12, 12,  8,  9])

In [8]: arr_slice=arr[5:8]

In [9]: arr_slice
Out[9]: array([12, 12, 12])

In [10]: arr_slice[1]=12345

In [11]: arr_slice
Out[11]: array([   12, 12345,    12])

In [12]: arr
Out[12]:
array([    0,     1,     2,     3,     4,    12, 12345,    12,     8,
           9])

 Numpy涉及的目的是处理大数据,不专注数据复制,如果想得到ndarray切片的一份副本而非试图,就需要显式地进行复制操作,例如arr[5:8].copy() 

 对于高维度数组,能做的事情更多。在一个二维数组中,各索引位置上的元素不再是标量而是一维数组

切片索引

ndarry的切片语法跟python列表这样的一维对象差不多:

切片式沿着一个轴向选取元素的,像这样进行切片的时候,只能得到相同维数的数组试图。

In [47]: arr2d[:2,1:]
Out[47]:
array([[2, 3],
       [5, 6]])

 

 

In [56]: data=np.random.randn(7,4)

In [57]: data
Out[57]:
array([[-0.47913266, -0.30477197,  0.66404979, -0.9187831 ],
       [ 1.47680489, -1.29158289,  0.34761902,  0.12130798],
       [ 0.56144005,  1.36820597, -2.00164737, -0.2554913 ],
       [-0.56632529,  0.84605031,  1.00731573, -1.67826478],
       [-0.26310489, -0.32148272, -1.57393012, -0.6656574 ],
       [ 1.2186885 ,  0.98964553, -0.75777939,  0.59467277],
       [ 0.18207753,  0.21029665, -1.74577673,  0.95509791]])

  

 布尔型索引 

In [58]: names
Out[58]: array([‘Bob‘, ‘Joe‘, ‘Will‘, ‘Bob‘, ‘Will‘, ‘Joe‘, ‘Joe‘], dtype=‘<U4‘)

In [59]: names==‘Bob‘
Out[59]: array([ True, False, False,  True, False, False, False])

In [60]: data[names==‘Bob‘]
Out[60]:
array([[-0.47913266, -0.30477197,  0.66404979, -0.9187831 ],
       [-0.56632529,  0.84605031,  1.00731573, -1.67826478]])

 

选区三个名字中的两个需要组合应用多个布尔条件,使用&(和)、|(或)之类的布尔算术运算符即可:

In [79]: mask=(names==‘Bob‘)|(names==‘Will‘)

In [80]: mask
Out[80]: array([ True, False,  True,  True,  True, False, False])

In [81]: data[mask]
Out[81]:
array([[-0.47913266, -0.30477197,  0.66404979, -0.9187831 ],
       [ 0.56144005,  1.36820597, -2.00164737, -0.2554913 ],
       [-0.56632529,  0.84605031,  1.00731573, -1.67826478],
       [-0.26310489, -0.32148272, -1.57393012, -0.6656574 ]])

  通过布尔型数组设置值是一种经常用到的手段

In [83]: data[data<0]=0

In [84]: data
Out[84]:
array([[0.        , 0.        , 0.66404979, 0.        ],
       [1.47680489, 0.        , 0.34761902, 0.12130798],
       [0.56144005, 1.36820597, 0.        , 0.        ],
       [0.        , 0.84605031, 1.00731573, 0.        ],
       [0.        , 0.        , 0.        , 0.        ],
       [1.2186885 , 0.98964553, 0.        , 0.59467277],
       [0.18207753, 0.21029665, 0.        , 0.95509791]])

  

重温《利用Python进行数据分析》-第4章-2

原文:https://www.cnblogs.com/chefli/p/11110085.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!