首页 > 编程语言 > 详细

【学习】通用函数:快速的元素级数组函数【Numpy】

时间:2017-09-04 23:33:42      阅读:356      评论:0      收藏:0      [点我收藏+]

通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数。可以将其看做简单函数(接受一个或多个标量值,并产生一个或多个标量值)的矢量化包装器。

 sqrt 和 exp为一元(unary)ufunc,add或maxinum接受2个数组,因此也叫二元(binary) ufunc, 并返回一个结果数组

import numpy as np
arr = np.arange(10)

np.sqrt(arr)
Out[110]: 
array([ 0.        ,  1.        ,  1.41421356,  1.73205081,  2.        ,
        2.23606798,  2.44948974,  2.64575131,  2.82842712,  3.        ])

np.exp(arr)
Out[111]: 
array([  1.00000000e+00,   2.71828183e+00,   7.38905610e+00,
         2.00855369e+01,   5.45981500e+01,   1.48413159e+02,
         4.03428793e+02,   1.09663316e+03,   2.98095799e+03,
         8.10308393e+03])
x = np.random.randn(8)
y = np.random.randn(8)
x,y
Out[112]: 
(array([-1.68554158, -0.62988644, -0.65300182, -0.9357815 , -0.58973656,
        -1.13627121, -0.25952295, -0.7144267 ]),
 array([ 0.45716238,  0.49681059,  0.61541084, -2.41726508, -0.40145024,
        -0.74636291, -0.31083867,  0.58094538]))

np.maximum(x, y) #元素级最大值
Out[113]: 
array([ 0.45716238,  0.49681059,  0.61541084, -0.9357815 , -0.40145024,
       -0.74636291, -0.25952295,  0.58094538])

但有些ufunc可以返回多个数组,但不常见。例如modf, 它是python内置函数divmod的矢量化版本,用于浮点数组的小数和整数部分。

arr = np.random.randn(7) * 5

arr
Out[116]: 
array([-8.13879901,  0.5628696 ,  0.50146831, -0.94937254, -4.13344095,
        6.55263049,  9.20516911])

np.modf(arr)
Out[117]: 
(array([-0.13879901,  0.5628696 ,  0.50146831, -0.94937254, -0.13344095,
         0.55263049,  0.20516911]), array([-8.,  0.,  0., -0., -4.,  6.,  9.]))

一元ufunc

技术分享

技术分享

注意,log1p,为log(1+X),  底数为1+X  ;  

          ceil 为大于等于该值的最小整数;

          floor 即小于等于该值的最大整数

          rint 将各元素值四舍五入到最接近的整数,保留dtype

          modf 将数组的小数和整数部分以两个独立数组的形式返回

          logical_not  计算各元素的not x的真值,相当于-arr

二元ufunc

技术分享

常用的应该为add 加、subtract减 、multiply 乘、divide除、 power , maximum(fmax), minimum(fmin), mod

 

 1 、利用数组进行数据处理

numpy 数组可以将许多种数据处理任务表述为简洁的数组表达式(否则需要编写循环)。用数组表达式代替循环的做法,通过被称为矢量化。一般来说,矢量化数组运算要比造价的纯python方式快上一两个数量级(甚至更多),尤其是各种数值计算。

points = np.arange(-5, 5, 0.01) #1000个间隔相等的点

xs, ys = np.meshgrid(points, points)

ys
Out[120]: 
array([[-5.  , -5.  , -5.  , ..., -5.  , -5.  , -5.  ],
       [-4.99, -4.99, -4.99, ..., -4.99, -4.99, -4.99],
       [-4.98, -4.98, -4.98, ..., -4.98, -4.98, -4.98],
       ..., 
       [ 4.97,  4.97,  4.97, ...,  4.97,  4.97,  4.97],
       [ 4.98,  4.98,  4.98, ...,  4.98,  4.98,  4.98],
       [ 4.99,  4.99,  4.99, ...,  4.99,  4.99,  4.99]])

对该函数的求值运算,把这两个数组当做两个浮点数那样编写表达式即可:

import matplotlib.pyplot as plt

z = np.sqrt(xs ** 2 + ys ** 2)

z

Out[123]: 
array([[ 7.07106781,  7.06400028,  7.05693985, ...,  7.04988652,
         7.05693985,  7.06400028],
       [ 7.06400028,  7.05692568,  7.04985815, ...,  7.04279774,
         7.04985815,  7.05692568],
       [ 7.05693985,  7.04985815,  7.04278354, ...,  7.03571603,
         7.04278354,  7.04985815],
       ..., 
       [ 7.04988652,  7.04279774,  7.03571603, ...,  7.0286414 ,
         7.03571603,  7.04279774],
       [ 7.05693985,  7.04985815,  7.04278354, ...,  7.03571603,
         7.04278354,  7.04985815],
       [ 7.06400028,  7.05692568,  7.04985815, ...,  7.04279774,
         7.04985815,  7.05692568]])
plt.imshow(z, cmap = plt.cm.gray); plt.colorbar() plt.title("image plot of $\sqrt{x^2 + y^2}$ for a grid of values") Out[124]: <matplotlib.text.Text at 0xa4987b8> ?

技术分享

 

2、将条件逻辑表述为数组运算

 np.where函数的应用

 

【学习】通用函数:快速的元素级数组函数【Numpy】

原文:http://www.cnblogs.com/yizhenfeng/p/7475989.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!