中企动力 > 头条 > python中的numpy

网站性能检测评分

注:本网站页面html检测工具扫描网站中存在的基本问题,仅供参考。

python中的numpy

Python之numpy数组学习(二) 营销视频课程

img

冰岚

关注

前言

前面我们学习了numpy库的简单应用,今天来学习下比较重要的如何处理数组。

处理数组形状

下面可将多维数组转换成一维数组时的情形。

利用以下函数处理数组的形状:

拆解:ravel()函数可将多维数组变成一维数组。拉直(Flatten):flatten()函数与ravel()相同,但是,flatten()返回的是真实的数组,需要分配新的内存空间;而ravel()函数返回的只是数组的视图。用元组指定数组形状:除reshape()函数外,还可以用元组来定义数组的形状。转置:在线性代数中,矩阵的转置操作非常常见,转置是一种数据变换方法,对于二维表而言,转置就意味着行变成列,同时列变成行。调整大小:函数resize()的作用类似于reshape(),但是会改变所作用的数组。

堆叠数组

从深度看,数组既可以横向叠放,也可以竖向叠放。因此,可以使用vstack()、dstack()、hstack()、column_stack()、row_stack()、和concatenate()等函数。

首先我们要建立一些数组,然后整体说一下各种叠加方式,最后放上示例代码:

水平叠加:先介绍水平叠加方式,即用元组确定ndarrays()数组的形状,然后交由hstack()函数来码放这些数组。垂直叠加:使用垂直叠加方法,先要构建一个元组,然后将元组交给vstack()函数来码放数组。深度叠加:还有一种深度叠加方法,这要用到dstack()函数和一个元组。这种方法是沿着第三个坐标轴(纵向)的方法来叠加一摞数组。举例来说:可以在一个图像数据的二维数组上叠加另一幅图像的数据。列式堆叠:column_stack()函数以列方式对一维数组进行堆叠。行式堆叠:同时,numpy也有以行方式对数组进行堆叠的函数,这个用于一维数组的函数名为row_stack(),它将数组作为行码放到二维数组中。

整体代码如下:

#-*- coding:utf-8 -*-#stacking.pyimport numpy as np#创建数组a = np.arange(9).reshape(3,3)print(a)#Out:#array([[0, 1, 2],# [3, 4, 5],# [6, 7, 8]])b = 2 * aprint (b)#Out:#array([[ 0, 2, 4],# [ 6, 8, 10],# [12, 14, 16]])#水平叠加print (np.hstack((a, b)))#Out:#array([[ 0, 1, 2, 0, 2, 4],# [ 3, 4, 5, 6, 8, 10],# [ 6, 7, 8, 12, 14, 16]])print (np.concatenate((a, b), axis=1))#Out:#array([[ 0, 1, 2, 0, 2, 4],# [ 3, 4, 5, 6, 8, 10],# [ 6, 7, 8, 12, 14, 16]])#垂直叠加print (np.vstack((a, b)))#Out:#array([[ 0, 1, 2],# [ 3, 4, 5],# [ 6, 7, 8],# [ 0, 2, 4],# [ 6, 8, 10],# [12, 14, 16]])print (np.concatenate((a, b), axis=0))#Out:#array([[ 0, 1, 2],# [ 3, 4, 5],# [ 6, 7, 8],# [ 0, 2, 4],# [ 6, 8, 10],# [12, 14, 16]])#深度叠加print (np.dstack((a, b)))#Out:#array([[[ 0, 0],# [ 1, 2],# [ 2, 4]],# [[ 3, 6],# [ 4, 8],# [ 5, 10]],# [[ 6, 12],# [ 7, 14],# [ 8, 16]]])oned = np.arange(2)print (oned)#Out: array([0, 1])twice_oned = 2 * onedprint (twice_oned)#Out: array([0, 2])print (np.column_stack((oned, twice_oned)))#Out:#array([[0, 0],# [1, 2]])print (np.column_stack((a, b)))#Out:#array([[ 0, 1, 2, 0, 2, 4],# [ 3, 4, 5, 6, 8, 10],# [ 6, 7, 8, 12, 14, 16]])#数组对比print (np.column_stack((a, b)) == np.hstack((a, b)))#Out:#array([[ True, True, True, True, True, True],# [ True, True, True, True, True, True],# [ True, True, True, True, True, True]], dtype=bool)#列式堆叠print (np.row_stack((oned, twice_oned)))#Out:#array([[0, 1],# [0, 2]])print (np.row_stack((a, b)))#Out:#array([[ 0, 1, 2],# [ 3, 4, 5],# [ 6, 7, 8],# [ 0, 2, 4],# [ 6, 8, 10],# [12, 14, 16]])print (np.row_stack((a,b)) == np.vstack((a, b)))#Out:#array([[ True, True, True],# [ True, True, True],# [ True, True, True],# [ True, True, True],# [ True, True, True],# [ True, True, True]], dtype=bool)

小结

今天学习一下Python中numpy的堆叠数组。希望通过上面的操作能帮助大家。如果你有什么好的意见,建议,或者有不同的看法,我都希望你留言和我们进行交流、讨论。

Python之numpy数组学习(五)——广播 行业视频课程

img

江秋

关注

预备阅读: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数组学习(四)——索引和视图 行业视频课程

img

花想容

关注

预备阅读: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数组学习(一) 营销视频课程

img

Pont

关注

我回来了。

前言

前面已经安装并学习了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的简单使用。希望通过上面的操作能帮助大家。如果你有什么好的意见,建议,或者有不同的看法,我都希望你留言和我们进行交流、讨论。

img

在线咨询

建站在线咨询

img

微信咨询

扫一扫添加
动力姐姐微信

img
img

TOP