网站性能检测评分
注:本网站页面html检测工具扫描网站中存在的基本问题,仅供参考。
python怎么调用numpy
Python数据科学计算库的安装和numpy简单应用 营销视频课程
前言
如何使用Python进行科学计算和数据分析,这里我们就要用到Python的科学计算库,今天来分享一下如何安装Python的数据科学计算库。
数据科学计算库
Python中的数据科学计算库有Numpy、Scipy、pandas、matplotlib(前面我分享了一篇matplotlib的简单应用,历史文章上一篇就是)。
Numpy是一个基础性的Python库,为我们提供了常用的数值数组和函数。
Scipy是Python的科学计算库,对Numpy的功能进行了扩充,同时也有部分功能是重合的。Numpy和Scipy曾经共享过基础代码。
pandas是一个流行的开源Python项目,它的名称取paneldata(面板数据,一个计量经济学的术语)和Pythondataanalysis(Python数据分析)的意思。
matplotlib是一个基于Numpy的绘图库。
库的安装
安装这些库之前要先安装Python,默认已全部安装,(Windows直接下载安装,Linux自带2.7版本,可以自行安装3.6版本)。
为了节约时间在更重要的知识上,这里只介绍最简单的安装方式,即包管理工具安装Python库。
不管是Windows和Linux下,都可以在命令行下直接使用下面的命令来安装相关的库,前提是已经安装了pip包(pip包管理工具的相关安装可以看原文这里有链接):
pipinstallnumpyscipypandasmatplotlib或(easy_install是Python自带的)easy_installnumpyscipypandasmatplotlib#Linux下安装pip包sudoapt-getinstallpython-pip
说明:Linux下如果涉及权限问题则需要开头添加sudo。安装示例如下所示:
Numpy数组简单示例
我们已经安装好了numpy,然后就可以来个简单的小测试了。与传统的Python列表相比,进行数值运算时,numpy数组的效率要高的多。
完成相同的运算时,numpy代码和Python传统代码相比用到的显式循环语句明显要少,因为numpy是基于向量化的运算。
假设要对向量a和b进行求和,这里的向量指的是一个“一维数组”,a存放的是整数0到n-1的2次幂,如果n等于3,则a存的是0、1、4,向量b存的是整数0到n的3次幂,下面来看一下普通Python代码和numpy来计算的差别:
先看代码:
#filename:vectorsSum.pyimportsysfromdatetimeimportdatetimeimportnumpyasnp#numpy方法defnumpySum(n):a=np.arange(n,dtype='int64')**2#3次幂太大会溢出,注意(后面细说)b=np.arange(n,dtype='int64')**3c=a+breturnc#普通方法defpythonSum(n):#range()返回的是“rangeobject”,而不是实际的list值,所以这里要加上lista=list(range(n))b=list(range(n))c=[]foriinrange(len(a)):a[i]=i**2b[i]=i**3c.append(a[i]+b[i])returncsize=int(sys.argv[1])start=datetime.now()c=pythonSum(size)delta=datetime.now()-startprint("最后两个元素的和:",c[-2:])print("pythonSum花费的时间(微秒)",delta.microseconds)start=datetime.now()c=numpySum(size)delta=datetime.now()-startprint("最后两个元素的和:",c[-2:])print("numpySum花费的时间(微秒)",delta.microseconds)#下面测试一下对与1000个,2000个,3000个向量元素,运行结果如下图所示。
看一下运行结果:
Python之numpy数组学习(五)——广播 互联网视频课程
预备阅读:Python之numpy数组学习(一)Python之numpy数组学习(二)Python之numpy数组学习(三)Python之numpy数组学习(四)——索引和视图
为获得良好代码体验,建议查看原文。
前言
前面我们学习了numpy库的很多知识,今天来学习下数组的广播。
Numpy数组的广播
当操作对象的形状不一样时,numpy会尽力进行处理。
假设一个数组要跟一个标量相乘,这时标量需要根据数组的形状进行扩展,然后才可以执行乘法运算。这个扩展的过程叫做广播(broadcasting)。
广播的步骤如下:
①读取WAV文件
(本地没有找到好的直接下载WAV文件的网站,欢迎推荐)这里我们使用标准Python代码来下载《王牌大贱谍》中的歌曲Smashing,baby。Scipy中有一个wavfile子程序包,可以用来加载音频数据,或者生成WAV格式的文件。如果此前已安装了scipy,现在就可以直接用了。我们使用read()函数读取文件,它返回一个数据阵列及采样率,不过,我们这里只对数据本身感兴趣。
sample_rate, data = scipy.io.wavfile.read(WAV_FILE)
②绘制原WAV数据
这里我们利用matplotlib绘制原始WAV数据,并用一个子图来显示标题“original”,代码如下所示:
plt.subplot(2, 1, 1)plt.title("Original")plt.plot(data)
③新建一个数组
现在,我们要用numpy来生成一段“寂静的”声音。实际上,就是将原数组的值乘以一个常数,从而得到一个新数组,因为这个新数组的元素值肯定是变小了。这就是广播技术的用武之地。最后,我们要确保新数组和原数组的类型一致,即WAV格式。
newdata = data * 0.2
newdata = newdata.astype(np.uint8)
④写入一个WAV文件中。
将新数组保存到一个新的WAV文件中,代码如下:
scipy.io.wavfile.write("quiet.wav",sample_rate,newdata)
⑤绘制出新的WAV数据。
可以使用matplotlib来画出新数组中数据,代码如下:
plt.subplot(2, 1, 2)plt.title("Quiet")plt.plot(newdata)plt.show()
⑥展现原始WAV数据图像和新数组的图像。
下面用完整代码来说明一下:
#-*- coding:utf-8 -*-import scipy.io.wavfileimport matplotlib.pyplot as pltfrom urllib import requestimport numpy as npurl = 'http://thesoundarchive/austinpowers/smashingbaby.wav'response = request.urlopen(url)print (response.info())WAV_FILE = 'smashingbaby.wav'#二进制方式打开filehandle = open(WAV_FILE, 'wb+')filehandle.write(response.read())filehandle.close()sample_rate, data = scipy.io.wavfile.read(WAV_FILE)print ("Data type", data.dtype,"--", "Shape", data.shape)#原始图plt.subplot(2, 1, 1)plt.title("Original")plt.plot(data)#新数据newdata = data * 0.2newdata = newdata.astype(np.uint8)print ("Data type", newdata.dtype,"--", "Shape", newdata.shape)scipy.io.wavfile.write("quiet.wav",sample_rate, newdata)#新图像plt.subplot(2, 1, 2)plt.title("Quiet")plt.plot(newdata)plt.show()
小结
今天学习一下Python中numpy数组的广播。希望通过上面的操作能帮助大家。如果你有什么好的意见,建议,或者有不同的看法,我都希望你留言和我们进行交流、讨论。
Python之numpy数组学习(四)——索引和视图 公司视频课程
预备阅读:Python之numpy数组学习(一)Python之numpy数组学习(二)Python之numpy数组学习(三)
为获得良好代码体验,建议查看原文。
前言
前面我们学习了numpy库的简单应用和数组的处理,今天来学习下数组的视图和索引。
创建数组的视图和拷贝
在学习ravel()函数的时候,我看到了视图的概念,这让我很惊讶,但是注意,这里的视图和数据库中的视图不是一样的。在numpy中,视图不是只读的。关键在于,当前处理的是共享的数组视图,还是数组数据的副本。举例来说,可以取数组的一部分来生成视图,这意味着,如果先将数组的某部分赋值给一个变量,然后修改原数组中相应位置的数据,那么这个变量的值也会随之变化。
这里,我们通过动物面部照片(face)照片来创建数组,然后创建视图,随后修改。这里的动物面部照片的数组是从Scipy函数获得。
看一下代码和效果图如下:
#-*- coding:utf-8 -*-import scipy.miscimport matplotlib.pyplot as plt#创建图片数组face = scipy.misc.face()print (face.shape)#副本acopy = face.copy()#创建视图aview = face.view()# 展示照片数组plt.subplot(221)plt.imshow(face)#展示照片数据副本plt.subplot(222)plt.imshow(acopy)#展示视图plt.subplot(223)plt.imshow(aview)# 展示改变后的aview.flat = 0plt.subplot(224)plt.imshow(aview)plt.show()
可以看到,只有一副图片可以看到该动物图片,如上图所示。
同样可以看到,程序最后修改了视图,同时改变了原来的照片数组,这导致3副图片全部变黑。而复制的数组没有变化。所以,要记住:numpy中,视图不是只读的。
Numpy的索引
1、花式索引
花式索引是一种传统的索引方法,它不使用整数或者切片。这里,我们将利用花式索引来把动物图片(face)对角线上的值全部置0,相当于沿着两条交叉的对角线画两条黑线。
看一下完整代码和效果。
#-*- coding:utf-8 -*-import scipy.miscimport matplotlib.pyplot as plt# 加载图片数组face = scipy.misc.face()'''这里说明一下,默认是正方形的图片,如果不是,则需要xmax和ymax的值一样大小。(PS.Python3.6中scipy的图片规格变成了768*1024)'''xmax = face.shape[0]ymax = face.shape[0]#ymax = face.shape[1]报错,#IndexError: shape mismatch: indexingarrays could not be broadcast together with shapes (768,) (1024,)# 设置对角线的值为0# x 0-xmax# y 0-ymaxface[range(xmax), range(ymax)] = 0# 设置另一条对角线的值为0# x xmax-0# y 0-ymaxface[range(xmax-1,-1,-1), range(ymax)] = 0# 展示效果plt.imshow(face)plt.show()
2、基于位置列表的索引方法
下面利用ix_()函数将动物图片的像素完全打乱。这个函数可以根据多个序列生成一个网格,它需要一个一维序列作为参数,并返回一个由numpy数组构成的元组。
利用位置列表索引numpy数组的过程如下:
①打乱数组的索引。用numpy.random子程序包中的shuffle()函数把数组中的元素按随机的索引号重新排列,使数组产生相应的变化。
②使用代码画出打乱后的索引。
③照片的像素被完全打乱后,展示效果。
代码和效果如下图所示:
#-*- coding:utf-8 -*-import scipy.miscimport matplotlib.pyplot as pltimport numpy as np# 加载图片数组face = scipy.misc.face()xmax = face.shape[0]ymax = face.shape[1]#打乱数组的索引def shuffle_indices(size):arr = np.arange(size)np.random.shuffle(arr)return arrxindices = shuffle_indices(xmax)np.testing.assert_equal(len(xindices), xmax)yindices = shuffle_indices(ymax)np.testing.assert_equal(len(yindices), ymax)# 重画打乱后的索引plt.imshow(face[np.ix_(xindices, yindices)])plt.show()
3、用布尔型变量索引numpy数组
布尔型索引是指根据布尔型数组来索引元素的方法,属于花式索引系列。因为布尔型索引是花式索引的一个分类,所以它们的使用方法基本相同。
下面看代码和效果展示。
#-*- coding:utf-8 -*-import scipy.miscimport matplotlib.pyplot as pltimport numpy as np# 加载图片数组face = scipy.misc.face()#在对角线上画点def get_indices(size):arr = np.arange(size)return arr % 4 == 0# 仅绘画出选定的点face1 = face.copy()xindices = get_indices(face.shape[0])yindices = get_indices(face.shape[0])#因为图片大小不是正方形,这里截取正方形图片face1[xindices, yindices] = 0plt.subplot(211)plt.imshow(face1)face2 = face.copy()#选取数组值介于最大值的1/4到3/4的元素,将其置0face2[(face > face.max()/4) & (face plt.subplot(212)plt.imshow(face2)#展示效果plt.show()
小结
今天学习一下Python中numpy数组的视图和索引。希望通过上面的操作能帮助大家。如果你有什么好的意见,建议,或者有不同的看法,我都希望你留言和我们进行交流、讨论。
Python之numpy数组学习(一) 企业视频课程
我回来了。
前言
前面已经安装并学习了Python中的科学计算库,今天主要学习下numpy数组。
Numpy数组对象
Numpy中的多维数组称为ndarray,它有两个组成部分。
数据本身。描述数据的元数据。
在数组的处理过程中,原始数据不受影响,变化的只是元数据。
Numpy数组通常是由相同种类的元素组成,即数组中数据类型必须一致。好处是:数组元素类型相同,可轻松确定存储数组所需的空间大小。同时,numpy可运用向量化运算来处理整个数组。Numpy数组的索引从0开始。(这里我使用的是ipython命令行,ipython最近刚开始用,以后详细介绍下。)
In[3]:importnumpyasnpIn[4]:a=np.arange(5)In[5]:a.dtypeOut[5]:dtype('int32')
上面数组的数据类型为int32,这一般跟你安装的Python版本有关。不过我安装的是64位,不知道怎么回事这里是int32,后面再检查下。
上一篇我们说了向量(一维的numpy数组)的创建方法,下面看一下上面生成的向量。
In[6]:aOut[6]:array([0,1,2,3,4])In[7]:a.shapeOut[7]:(5,)
可以看到,该向量有5个元素,该数组的shape属性是一个元组,存放的是数组在每一个维度的长度。
创建多维数组
我们已经知道了如何创建向量,下面开始建立多维numpy数组,生成矩阵后,再看它的形状。
In[8]:m=np.array([np.arange(2),np.arange(2)])In[9]:mOut[9]:array([[0,1],[0,1]])
上面我们用arrange方法创建了一个简单的2*2的数组,利用array()函数创建数组时,需要传递给它一个对象,并且这个对象必须是数组类型。如Python的列表。
创建之后,我们要选择矩阵的元素,这里就相当于一个二维坐标系,我们只要找到对应的坐标即可。
In[10]:m[0,0]Out[10]:0In[11]:m[0,1]Out[11]:1In[12]:m[1,0]Out[12]:0In[13]:m[1,1]Out[13]:1
可以看到,选择数组元素很简单,对于数组m,只要通过m[m,n]的形式,就能访问数组内的元素,其中m和n为数组元素的下标,从0开始。
Numpy的数值类型
Python本身支持整型、浮点型和复数型,为了科学计算,numpy提供了更加丰富的数据类型,注意:numpy跟数学运算有关的数据类型的名称都以数字结尾。这个数字指示了该类型的变量所占用的二进制位数。Numpy的各种数值类型如下图所示:
每一种数据类型都有相应的转换函数,许多函数都带有一个指定数据类型的参数,该参数一般可选。
In[15]:np.float64(30)Out[15]:30.0In[16]:np.bool(30)Out[16]:TrueIn[17]:np.float(True)Out[17]:1.0In[18]:np.int8(30)Out[18]:30In[20]:np.arange(7,dtype='uint16')Out[20]:array([0,1,2,3,4,5,6],dtype=uint16)
注意:不允许把复数转化成整型。也不允许把复数转化为浮点数,但是允许把浮点数转化为复数。复数的实部和虚部分别使用real()函数和imag()函数提取。
数据类型对象是numpy.dtype类的实例。数组是一种数据类型。数据类型对象表明了数据占用的字节数,所占用字节的具体数目一般存放在类dtype的itemsize中。
In[6]:importnumpyasnpIn[7]:a=np.arange(5)In[8]:aOut[8]:array([0,1,2,3,4])In[9]:a.dtype.itemsizeOut[9]:4
一维数组的切片和索引
一维numpy数组的切片操作和Python列表的切片一样,看一下下面的例子来体验一下。
In[34]:a=np.arange(9)In[35]:aOut[35]:array([0,1,2,3,4,5,6,7,8])#通过下标取数据In[36]:a[3:7]Out[36]:array([3,4,5,6])#用下标选择元素,范围0到7,下标每次递增2In[37]:a[:7:2]Out[37]:array([0,2,4,6])#反转数组In[38]:a[::-1]Out[38]:array([8,7,6,5,4,3,2,1,0])
小结
今天学习一下Python中numpy的简单使用。希望通过上面的操作能帮助大家。如果你有什么好的意见,建议,或者有不同的看法,我都希望你留言和我们进行交流、讨论。