开发者学堂课程【高校精品课-华东师范大学 - Python 数据科学基础与实践:Numpy--通用函数】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1067/detail/15378
Numpy--通用函数
内容介绍
一、前言
二、通用函数
一、前言
在part two里面要学的第二个内容是Python数据科学包里面的一个重要的基础,来看看 numpy 里面有哪些知识需要掌握,同时给同学们总共准备了四个 nextbook 文件,其中第一个是numpy 里面的最基本的知识,这个内容让同学们自己去看这份多维数组对象的的文件,然后去掌握一下相关内容。
这个课里面主要介绍是第二个内容里面的通用函数以及第三个内容数组导向的编程,第四个内容比较简单,内容就是 numpy 的数据怎么保存,怎么导入,换句话而言就是它的输入和输出,这个也自己去看一下。
二、通用函数
那么下面的学习一下第二个内容numpy 里面可以做一些通用函数,函数的运算就叫通用函数。通用函数可以实现快速的点对点的数组运算,点对点就是数组里面的元素对元素的运算,这个名字叫做 universal function ,或 ufunc ,它是建立在第一个内容ndarray的基础之上的,是用来在ndarray中实现element-wise操作的,可以实现元素与元素之间的操作,可以认为这个 ufunc 可以把一些简单的函数做快速的向量化封装,输入是一个以上的标量,输出也是一个以上的标量。
比如很多通用函数ufuncs都是点对点的变换,下面来学习里面的内容,像sqrt或exp:首先先导入 numpy ,为了减少输入给它做一个别名Np的两个字母,原来它是五个字母,下面使用 np.arange 函数,numpy当中是arange 函数,十代表的是零到九,这样的十个数,现在显示一下数组,在 out 这行显示的是在第一个数组前面有一个 array,表示它是一个numpy的多维数组对象,numpy 的 array 的多维数组对象是在第一个 nextbook,学这个之前应该把第一个的相关内容走一遍。
In[1]:import numpy as np
arr = np.arange(10)
arr
Out [1]:array([o, 1, 2, 3, 4, 5, 6, 7, 8, 9])
接下来是numpy 当中求平方根的通用函数,然后 arr 上面求开平方,然后它是元素级别的这一个函数,它会作用在每一个元素上面,大家看看它开放的结果,这个也是 numpy 强大的地方,除了它本身的这个性能速度很快,然后它可以有通用函数,还有作用在第一个多维数组的每一个元素上面,这是它非常强大的地方,非常适合做机器学习当中的数据挖掘和文本挖掘。
In[23]:np.sqrt(arr)
Out [23]: array([0. ,1. ,1.41421356, 1.73205081,2. j)
2.23606798,2.44948974,2.64575131,2.82842712,3.
下面再看一些例子,这个是exp,那么它是e 的多少次方,它是在每一个元素上进行操作,那么e的零次方是一,那么里面的每一个值可以对应看一下。那么里面就是传了一个多维数组,它可以在每个元素上进行操作。
In [3]: np.exp(arr)
Out [3]:array([1.00000000e+00, 2.71828183e+00, 7.38905610e+00, 2.008553699+01,
5.45981500e+01.1.48413159e+02, 4.03428793e+02, 1.09663316e+03,
2.98095799e+03, 8.10308393e+03])
这些函数叫做一元通用函数(unary ufuncs)。其他一些函数,比如add或maximum,需要两个数组(binary ufuncs),并返回一个数组作为结果。接下来可以看一下下面的例子,x 和 y两个随机数,然后显示一下这个结果,然后要来求这两个里面的最大值,那么它是需要两个参数加入进去,然后运行一下,大家应该能够发现它这个里面反馈的是一个 x 和 y 里面,然后两个对应的元素,哪一个大就显示哪一个,x里面的第一个元素是负的1.06,y里面是0.2727,第二个也是一样的元素和元素的操作。
In [25]:x= np. random. randn(8)
y =np.random.randn(8)
Out[25]: array([ 1.04165307,-1.43376497, -0.95048054, -0.01534411,-1.34484258,
1.09032066, 0.2778578,-1.32737648])
In [26]:y
Out[26]: array([ 1.79557033, -0.37206594, -0.50156849, -0.55333631, 1.48444226,
1.61665193, 2.83772666, -0.0805214 ])
In [27]:np.maximum(x, y)
Out[27]:array([ 1.79557033,-0.37206594.-0.50156849,-0.01534411.1.48444226.
1.61665193, 2.83772666.-0.0805214 ])
那么下面大家可以讨论一下,比如在 np 当中也有一个 max 函数,对于 max 函数就把 x 和 y 放到中括号里面,把它构成一个列表,然后再看看单独求x的最大值和单独求y的最大值。然后来看它里面的这个结果是什么,那么运行一下的结果,因为这个例子主要重新执行它的数据都变化了,那么在x和y两个有一个列表,然后要求这个列表里面的最大值,这个最大值在整个数据里面是2.6,大家看看应该是在x里面,它里面最大的是2.6。然后如果是x是2.6,y是0.61,这个是y,y最大值是0.61,大家注意观察一下这个结果,那么mamimum点对点的比较x和y中的元素。尽管不常见,但ufunc也能返回多个数组。
例如modf,这是一个向量版的divmod(python内建函数),modf会返回小数部分和整数部分:本函数是实现a除以b,然后返回商与余数的元组。如果两个参数a,b都是整数,那么会采用整数除法,结果相当于(a//b, a % b)。如果a或b是浮点数,相当于(math.floor(a/b),a%b)。
In [7]:np.max([x,y]),np.max(x),np.max(y
Out[7]:(2.6069921225028114,2.6069921225028114, 0.6154500812910014)
那么下面再看这一个随机数,然后就是在每一个随机数上面再乘以五,然后再下面这个是用了一个除法,它可以有整数和余数,一个是整个部分,然后一个是余数。那么运行一下这个函数,它反馈的结果是反馈两个值,那么它在余数部分一个元素是0.39,第二个是负的0.53,它们就是余数部分。然后再看一下整数部分,它的第一个元素是2,第二个是负0,所以一个通用函数返回的结果是两个数组,刚刚那个特殊函数是有两个参数就是两个数组,而这个是返回一个数组。这个例子就是告诉的是一个特殊情况,给它是一个arr 数组返回两个数组。
In [8]: arr= np. random.randn(7)*5
arr
Out [8]: array([2.39066397, -0.53549094. -8.47985563. -2.189113 6.0836329-2.94515023. 8.78793467)
In [10]: remainder, whole_part =np.modf(arr)
remainder
Out [10]: array([ 8.23454109e-01,-4.00246686e-02,-6.53887900e-01,-5.52413588e-01,5.01665824e-01, 8.22405852e-04,-5.36379749e-01])
In[12]: whole_part
Out[12]:array([ 2.. -3..-8., -0., 0., 8.,])
那么另外这个 ufunc funtion 通用函数,它能接受一个可选参数作为输出,那么这样可以直接更改原有的数组。比如说上面的那个 array ,刚刚创建的随机的数组乘以五以后是这样的一个值,然后给它开平方,然后后面给它一个注释,它没有改变原有的数组那么如果显示一下原有数组,大家注意看到它的这个值还是原来的,它没有改变。那么开方这有几个空值,那因为负的是无法开放的,所以它是返回空值的。然后显示到这个 arr ,它还是原始值并没有改变。
In[12]: arr
Out[12]:array([ 2 39066397 -0.53549094,-8.47985563,-2.189113 6.0836329
-2.94515023. 8.78793467])
In[13]:np.sqrt(arr)#没有改变原有的arr
D:\Anaconda3\lib\site-packages\ipykernel_launcher.py:1: RuntineWarning: invalid value encountered in sqrt ""Entry point for launching an IPython kernel.
Out [13]:array([1.54617721, I nan. nan, nan, 2.46650216.
nan. 2.96444509])
In[14]: #没有改变原有的arr
print(arr)
[ 2.39066397-0.53549094 -8.47985563 -2.189113 6.0836329 -2.94515023
8.78793467]
那么如果想改变就可以接受一个可选参数作为输出,这样就可以改变原有的结果。然后来看一个例子,对于 arr 进行开方,然后再给它一个 arr ,就是用一个 arr 接触 arr 的开方,这样就改变了原有的数组的值。然后显示一下这个速度结果,后来发现这个arr 改变了。然后呢再举个例子,这个是创建一个149这样的一个andy,它就是一个一维数组。
然后开方看到结果是123,接下来显示一下a1,它是123,看到A1的值改变掉了。
那么这就是给同学们讲了一下通用函数的一些概念,当然这个关于Python的知识只是给大家引入一些比较重要的,最基础给大家提供资料。
如果大家还想进一步扩充,那么这种思考题也可以去考虑一下,比如一元的通用函数和二元通用函数可以在这里做做笔记再扩展一下。
In[15]: np.sqrt(arr, arr,casting='unsafe') #改变了原有的arr
D:\Anaconda3\lib\site-packages\ipykernel_launcher.py:1: RuntimeWarning: invalid value encountered in sqrt“"Entry point for launching an IPython kernel.
Out [15]:array([1.54617721, nan, nan, nan, 2.46650216,
nan, 2.96444509])
In [16]: arr
nan,
Out[16]:array([1.54617721,
nan, 2.96444509]) nan, nan,2.46650216,
In [17]: al-np.array([1,4.9])I
In [22]: np.sqrt(al,al,casting-'unsafe')
Out [22]: array([1, 2, 3])
In{19}:a1
Out{19}:array([1,2,3])