开发者学堂课程【高校精品课-华东师范大学 - Python 数据科学基础与实践:Numpy 数组导向编程 下】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1067/detail/15377
Numpy 数组导向编程 下
内容介绍
一、数学和统计方法
二、布尔数组的方法
三、排序
四、单一性和其他集合逻辑
一、数学和统计方法
那么下面再来看一下 Numpy 里面的数学和统计方法,这个对于专业同学来说应该是比较简单,就是一些计算算统计值的一些函数,然后可以按照某一个轴来计算,或者在整个数组上进行计算。那么这个函数主要有一些聚合函数或者叫汇总函数,那一般的都会被叫做降维、求和、平均值以及标准差。那么下面来看一些汇总统计的例子。那么这里大家看到五行四列创建这样一个随机数组,它作为随机的多维数组。
In [9]: arr = np. randon.randn(5, 4)
arr
Out [9]: array([[ 0.59668886, 0.0443165 , 0.46425491, -0.44225775]
[-0.07679124. 0.11099483,-0.04723338, 0.096159 ].
[ 0.25249836,-0.59914664. 0.43061394,-0.28638254].
[ 0.55876525, -0.45482101, 0.42937669, 1.06275356.
[ 0.25732032, 1.66634594, 0.24840452, -1.09161622]])
In [4]: arr. mean ()| I
Out [4]: -0.008387550588445092
In [5]: np. mean(arr)
Out [5]: -0.008387550588445092
In [6]: arr. sum()
Out [6]: -0.16775101176890184
然后就可以求平均值了,那么注意看这是一个汇总的平均值,它是得到整个多维数组的平均值,所以它是可以降维了。它不是每一个元素上的平均值,平均值本身就是汇总的概念,它不是单个元素通用函数的操作。
然后也可以用这样的用法就是 Numpy .mean。然后可以求和,比如 mean, sum 这样的函数能接受 axis 作为参数来计算统计数字,接下来看下面的例子。
In [17]:arr.mean(axis=1)
Out [17]: array([ 0.16575063, 0.0207823,-0.05060422, 0.39901862, 0.27011364])
In [16]: arr.sum(axis=0)
Out[16]: array([ 1.58848155, 0.76768962, 1.52541669,-0.66134396])
对于 arr.mean(axis=1)这样的等于1表示的是在行的数据上面,每一行上面有几列,然后就按照列上的数据进行汇总。前面数据是五行四列的,所以它产生了五个结果,这五个结果是在一行上面的四列的平均值,第一行四列的平均值,第二行四列的平均值,所以说行上面的1代表的是对于列来进行求平均值。
那么很显然当x=0的时候是按照列,在列上面的每一行加在一起的求和,所以说零和一要区分清楚,下面有解释就是说这里 arr.mean(1) 表示,compute mean acros the columns(计算各列之间的平均值)。arr.sum(0) 表示,compute sum down the rows(计算各行总和),所以说要注意差别,注意值的区分。其他一些方法,像cumsum和cumprod不做汇总,而是产生一个中间结果的数组,接下来看下面的例子。
In [9]:arr = np. array(D,1. 2、3, 4, 5.6,7]|
arr.cunsun()
Out[9]:array([ 0.1. 3, 6,10, 15,21,28],dtype=int32)
上面的计算是一个累加的结果,0+1=1,1+2=3,34396以此类推。
In [17]:np.cunstm?
对于多维数组,accumulation functions(累积函数)比如cumsum,返回的是同样大小的数组,但是部分聚合会沿着指示的轴向较低维度进行切片:10]:arr = np.array([[o, 1, 2], [a, 4.5].[6, 7, 8]])
(10]:array([[o, 1, 2],{3,4,5}
这是一个零到七的一个列表,下面用arr.cumsum 执行一下看看结果是什么,它的结果是产生一个中间数组的结果,它并不是刚刚讲的汇总,它的规律是上面的计算是一个累加的结果,这里有累加的公式,通过帮助看一些细节。
对于多维数组,accumulation functions(累积函数)比如cumsum,返回的是同样大小的数组,但是部分聚合会沿着指示的轴向较低维度进行切片。那这里构造了一个三行三列的数组,然后用 cumsum(axis=0)表示行,对于1一般表示列,这样做一下的结果。所以它的累加是怎么累加的,可以按照上面的公式去对照一下,然后在下面还是按照列X=1的列就乘法了。
In [19]: arr=np.array([[o. 1, 2],[3. 4, 5],[6, 7, 8]])arr
Out[19]:array([[o. 1. 2].
3,4.5].
[6. 7. 8]])
In [11]: arr.cumsum(axisI0) #沿着行加法
Out[11]:array([[0. 1. 2].
[3. 5. 7].
[9. 12, 15]], dtype=int32)
In [20]: arr.cumprod(axis=1) #沿着列乘法
Out[20]: array([[ 0. 0. 0].
[ 3. 12. 60].
[ 6. 42,336]],dtype=int32)
二、布尔数组的方法
再下一个内容是布尔数组的方法应用, sum 是用来计算布尔数组中有多少个 ture 的,因为在计算机里面要注意 ture 就是1,false 就是0,所以 sum 一下就可以证明有多少个 1就有多少个ture ,那接下来看下面的这个例子。
In [12]:arr = op.randoe.randn(100)/
(arr ) 0).sum(0# Number of positive values
Out[12]:55
In [13]: bools = m arte......是ru才会返回true,
bools = np.array(Palse, False, True, False])
In[14]: bools.any0)
Out[14]:True
In[15]:bools.a110
Out[15]:False
看下面这个例子它创建随机数组,它是一百多元素的随机数组,大家注意看 Arr大于零,大于零以后如果结果也是大于零,那么它的结果就是 ture ,否则就是 flase 。
它就产生一个布尔数组,然后因为 ture 就是1,所以就可以求和。其次看到运行结果,这里面存在54个正数,大于零就是正数所以存在54个正数,这就是布尔数组很巧妙的地方。然后还有其他两个办法来判断这个布尔数组,Lanv和all对于布尔数组特别有用,any检测数组中只要有一个ture返回就是ture, 而all检测数组中都是true才会返回true。这里面构建了 np.array 的数组,它里面的数值是布尔型的,如果用 any 运行结果就是 ture ,如果用 all 的话只有都是 ture 才是 ture 。比如说这里构建了一个样本数据,这必须有一个女性参加,这样就合格了。
三、排序
然后学习下面一个知识就是排序,numpy 中的排序,那么前面用过numpy 里面的 random 模块里面的随机数,大家想看看它的使用方法可以看一下帮助。
In [25]: np. random.randn?
#返回符合正态分布的数值
In [26]: arr = np.random.randn(6)
arr
Out[26]: array([ 0.17802325, -0.8397805 , 0.63065723, 1.30558435,-0.4214941,-0,78002002])
In [27]: arr. sort ()
In [28]: arr
Out[28]: array([-0.8397805 , -0.78002002, -0.4214941 , 0.17802325, 0.63065723,1.30558435])
如果是多维数组,还可以按axis排序:
它返回的是一个符合正态分布的数组,那么下面可以用一下,创建六个元素的随机数,它是符合正态分布的,然后它里面可以用数字函数排序,看一下排序结果从小到大排序,同时发现这个值改变掉了,刚刚是没有序的,但是看现在运行是有序的,就这个值是改变了。
In [29]: arr = np.random. randn (5, 3)
arr
Out[29]: array([[-0.76185631, 1.05152802, 1.06816836],
[-0.11757383,-0.53741589, 1.67076762],
1.22314565, 0.40200961,-1.06664294],
[-1.15495365, 0.68737544, 1.4245887 ],
[1.50863193,-0.75471796,-0.75452104]])
In [30]: arr.sort(1)
In [31]: arr
Out [31]: array([[-0.76185631】 1.05152802, 1.06816836],
[-0.53741589,-0.11757383, 1.67076762].
[-1.06664294. 0.40200961, 1.22314565],
[-1.15495365, 0.68737544, 1.4245887 ].
[-0.75471796,-0.75452104, 1.50863193]])
In [22]: arr.sort(0)
arr
Out[22]: array([[-1.18370647,-0.56706953, 0.13891474].
[-1.17800412,-0.17237675, 1.55011123],
[-0.55774521, 0.65546116, 1.97750271],
010433919 1 18276504 2 01061151
同时也可以按照坐标轴来排序,然后创建一个五行三列的数组,按照零代表行一代表列,按照这个排序来排一下,看一下这个排序的结果是在一个列当中,顺序其实是列和列之间的比较,大家注意看一下它的排序,零是在行和行之间比较。
同时要注意 sort 方法,它的值是会改变原有数组的顺序。刚刚看过这个例子里面 arr 值是改变掉的。
四、单一性和其他集合逻辑
那么这下面就是来了解一下 numpy里面所谓的单一性和其他结合的一个逻辑,numpy 也有一些基本的集合操作可以用于一维数组,它同时能够返回排好序且不重复的值。
然后下面创建一个 np array ,下面如果 unique 看一下,那么它是唯一的不重复的,这个 unique 函数就特别的有价值,然后在做数据分析的时候,某一列比如家庭收入里面可能有很多值,然后有 unique 就知道有哪几种不同的家庭收入。所以这个 unique 特别有价值,它就等于就是列的类别或者因子。
In [33]: names = np.array([ Bob', ’Joe', 'Will', Bob', 'Will', 'Joe', Joe'])
np.unique(names)
Out[33]: array([' Bob', 'Joe', 'Will']. dtype='<U4')
In [24]: ints =np.array([3, 3, 3, 2, 2, 1, 1, 4, 4])
In [25]: np.unique(ints)
Out[25]: array([1, 2, 3, 4])
再看下面一个例子,那么这是竖直型的,然后运行以后,它不重复的数据有这样一些,那么如果要用纯 python代码写的话, python 集合里面的元素不能重复,那么像这个inld这个函数也可以去看一下,这个函数测试的是一个数组是否在另外一个数组里面,它返回一个布尔,大家可以看一下它的含义,那么还有一些数据的集合操作也可以补充一下。
In [26]:sorted(set fnames))
Out[26]: ['Bob’,"Joe', 'Will']
np.inld,测试一个数组的值是否在另一个数组里,返回一个布尔数组:
In [27]:values =np.array([6, 0, 0, 3. 2, 5, 6])
In [28]:np.inld(values,[2, 3, 6])
Out [28]: array([True, False, False, True,True, False, True])