博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
读书笔记五--numpy
阅读量:4624 次
发布时间:2019-06-09

本文共 3894 字,大约阅读时间需要 12 分钟。

数组转置和轴对换

转置是重塑的一种特殊形式,返回的是源数据的视图(不会进行任何复制操作)。数组不仅有transpose方法,还有一个特殊的T属性:   

arr=np.arange(15).reshape((3,5))arrOut[56]: array([[ 0,  1,  2,  3,  4],       [ 5,  6,  7,  8,  9],       [10, 11, 12, 13, 14]])arr.TOut[57]: array([[ 0,  5, 10],       [ 1,  6, 11],       [ 2,  7, 12],       [ 3,  8, 13],       [ 4,  9, 14]])

进行矩阵计算时,经常需要用到该操作,比如利用np.dot计算矩阵内积:

arr=np.random.randn(6,3)np.dot(arr.T,arr)Out[59]: array([[2.39679519, 0.23607287, 0.27316386],       [0.23607287, 5.3207093 , 0.6367557 ],       [0.27316386, 0.6367557 , 3.50480009]])

对于高维数组,transpose需要得到一个由轴编号组成的元组才能对这些轴进行转置:

arr=np.arange(16).reshape((2,2,4))arrOut[61]: array([[[ 0,  1,  2,  3],        [ 4,  5,  6,  7]],       [[ 8,  9, 10, 11],        [12, 13, 14, 15]]])arr.transpose((1,0,2))Out[62]: array([[[ 0,  1,  2,  3],        [ 8,  9, 10, 11]],       [[ 4,  5,  6,  7],        [12, 13, 14, 15]]])

还有一个swapaxes方法,它需要接收一对轴编号:

arrOut[63]: array([[[ 0,  1,  2,  3],        [ 4,  5,  6,  7]],       [[ 8,  9, 10, 11],        [12, 13, 14, 15]]])arr.swapaxes(1,2)Out[64]: array([[[ 0,  4],        [ 1,  5],        [ 2,  6],        [ 3,  7]],       [[ 8, 12],        [ 9, 13],        [10, 14],        [11, 15]]])

swapaxes也是返回源数据的视图(不会进行任何复制操作)。

 

通用函数:快速的元素级数组函数

通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数。可以将其看做简单函数(接收一个或多个标量值,并产生一个或多个标量值)的矢量化包装器。
许多ufunc都是简单的元素级变体,如sqrt和exp:
x=np.random.randn(8)xOut[7]: array([-0.45367765,  0.45448697,  0.05901557, -1.14350864,  0.93985719,       -1.37405764,  0.54604076, -1.52919879])y=np.random.randn(8)yOut[9]: array([-2.44401238, -0.57907323, -2.42303926,  0.25004382,  0.78757902,        0.13324314,  0.8643189 ,  0.6892275 ])#x,y中的每个元素进行对比,选较大的值np.maximum(x,y)Out[10]: array([-0.45367765,  0.45448697,  0.05901557,  0.25004382,  0.93985719,        0.13324314,  0.8643189 ,  0.6892275 ])

有些ufunc可以返回多个数组,modf就是一个例子,它是Python内置函数divmod的矢量化版本,用于浮点数组的小数和整数部分。

1 arr=np.random.randn(7)*5 2  3 arr 4 Out[12]:  5 array([ 1.36965276, -0.29453957,  5.0043914 , -3.93568688, -4.50608498, 6         1.40926456, -1.99294205]) 7  8 #modf返回的2个数组分别是浮点数的小数部分和整数部分 9 np.modf(arr)10 Out[13]: 11 (array([ 0.36965276, -0.29453957,  0.0043914 , -0.93568688, -0.50608498,12          0.40926456, -0.99294205]), array([ 1., -0.,  5., -3., -4.,  1., -1.]))

 

                                       一元ufunc(几个常用的)
abs、fabs 计算整数、浮点数或复数的绝对值。对于非复数值,可以使用更快的fabs
sqrt 计算各元素的平方根,相当于arr**0.5
square 计算各元素的平方,相当于arr**2
exp 计算各元素的指数
                                                 
                                          二元ufunc
add 将数组中对应的元素相加
substract 从第一个数组中减去第二个数组中的元素
multiply 数组元素相乘
divide、floor_divide 除法或向下圆整除法(丢弃余数)

利用数组进行数据处理

用数组表达式代替循环的做法,通常被称为矢量化。一般来说,矢量化数组运算要比等价的纯Python方式快上一两个数量级(甚至更多),尤其是各种数值计算。
假设我们想要在一组值(网格型)上计算函数sqrt(x**2+y**2)。np.meshgrid函数接受两个一维数组,并产生两个二维矩阵:
1 points=np.arange(-5,5,0.01) 2  3 xs,ys=np.meshgrid(points,points) 4  5 ys 6 Out[16]:  7 array([[-5.  , -5.  , -5.  , ..., -5.  , -5.  , -5.  ], 8        [-4.99, -4.99, -4.99, ..., -4.99, -4.99, -4.99], 9        [-4.98, -4.98, -4.98, ..., -4.98, -4.98, -4.98],10        ...,11        [ 4.97,  4.97,  4.97, ...,  4.97,  4.97,  4.97],12        [ 4.98,  4.98,  4.98, ...,  4.98,  4.98,  4.98],13        [ 4.99,  4.99,  4.99, ...,  4.99,  4.99,  4.99]])

 

现在把这两个数组当做两个浮点数那样编写表达式:

1 import matplotlib.pyplot as plt 2  3 z=np.sqrt(xs**2+ys**2) 4  5 z 6 Out[21]:  7 array([[7.07106781, 7.06400028, 7.05693985, ..., 7.04988652, 7.05693985, 8         7.06400028], 9        [7.06400028, 7.05692568, 7.04985815, ..., 7.04279774, 7.04985815,10         7.05692568],11        [7.05693985, 7.04985815, 7.04278354, ..., 7.03571603, 7.04278354,12         7.04985815],13        ...,14        [7.04988652, 7.04279774, 7.03571603, ..., 7.0286414 , 7.03571603,15         7.04279774],16        [7.05693985, 7.04985815, 7.04278354, ..., 7.03571603, 7.04278354,17         7.04985815],18        [7.06400028, 7.05692568, 7.04985815, ..., 7.04279774, 7.04985815,19         7.05692568]])20 plt.imshow(z,cmap=plt.cm.gray);plt.colorbar()21 Out[22]: 

 

 

 

转载于:https://www.cnblogs.com/dataAnalysis/p/9306002.html

你可能感兴趣的文章
autofac
查看>>
MacOS 系统终端上传文件到 linux 服务器
查看>>
Excel导出POI
查看>>
兼容性
查看>>
自动执行sftp命令的脚本
查看>>
转 Merkle Tree(默克尔树)算法解析
查看>>
网络编程基础之socket编程
查看>>
各种浏览器的user-agent和
查看>>
Restful levels
查看>>
Phonegap移动开发:布局总结(一) 全局
查看>>
Java 变参函数的实现
查看>>
nrf51 SDK自带例程的解读
查看>>
SESSION技术
查看>>
数据结构(五)之直接插入排序
查看>>
SQL函数——LENGTH()和LENGTHB()
查看>>
vim - manual -个人笔记
查看>>
详解Javascript中prototype属性(推荐)
查看>>
angularjs实现首页轮播图
查看>>
Git 对象 和checkout 和stash的笔记
查看>>
团队项目总结2-服务器通信模型和顺序图
查看>>