您的位置:首页 > 编程语言 > Python开发

NumPy使用手记

2015-02-01 20:31 253 查看
前面一个NumPy系列基本上是抄书,没有多少具体的内容。最近做实验经常使用NumPy,确实感觉到向量计算的强大。这个系列开始,我记录在使用NumPy使用中的一些具体的技巧和注意事项。

1) 巧用 where函数

where函数是numpy的内置,也是一个非常有用的函数,提供了快速并且灵活的计算功能。

def f_norm_1(data, estimate):

residule = 0

for row_index in range(data.shape[0]):

for column_index in range(data.shape[1]):

if data[row_index][column_index] != 0:

residule += (data[row_index][column_index] - estimate[row_index][column_index]) ** 2

return residule

def f_norm_2(data, estimate)

return sum(where(data != 0, (data-estimate) **2, 0))

这两段代码完成同样的功能,计算两个矩阵的差,然后将残差进行平方,注意,因为我需要的是考虑矩阵稀疏性,所以不能用内置的norm,函数1是我用普通的python写的,不太复杂,对于规模10*10的矩阵,计算200次耗时0.15s,函数2使用了where函数和sum函数,这两个函数都是为向量计算优化过的,不仅简介,而且耗时仅0.03s,
快了有五倍,不仅如此,有同学将NumPy和matlab做过比较,NumPy稍快一些,这已经是很让人兴奋的结果。

本篇我们看看NumPy中最为基本的Array操作

>>> from numpy import *

创建一个矩阵

>>> a=array([[1,2,3],[4,5,6]])

>>> a.shape

(2, 3)

>>> b=arange(15);print b

[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]

>>> b.reshape(3,5)

array([[ 0, 1, 2, 3, 4],

[ 5, 6, 7, 8, 9],

[10, 11, 12, 13, 14]])

可以看到,A是2行3列的矩阵。通过arange方法,可以得到一个1维的数组。然后我们可以通过reshape方法改变它的维度。

>>> c=zeros((4,5));print c

[[ 0. 0. 0. 0. 0.]

[ 0. 0. 0. 0. 0.]

[ 0. 0. 0. 0. 0.]

[ 0. 0. 0. 0. 0.]]

>>> d=ones((5,7));print d

[[ 1. 1. 1. 1. 1. 1. 1.]

[ 1. 1. 1. 1. 1. 1. 1.]

[ 1. 1. 1. 1. 1. 1. 1.]

[ 1. 1. 1. 1. 1. 1. 1.]

[ 1. 1. 1. 1. 1. 1. 1.]]

>>> e=add(c,arange(20).reshape(4,5))

>>> f=dot(e,d);print f

[[ 10. 10. 10. 10. 10. 10. 10.]

[ 35. 35. 35. 35. 35. 35. 35.]

[ 60. 60. 60. 60. 60. 60. 60.]

[ 85. 85. 85. 85. 85. 85. 85.]]

使用zeros可以生成一个零矩阵。同理,用ones可以生成值全部为1的矩阵。我选择了一个4*5的矩阵e,和一个5*7的矩阵d做点乘。最后得到f矩阵。再举一个更加明显的例子:

>>> a=arange(5);print a

[0 1 2 3 4]

>>> b=arange(5).reshape(5,1);print b

[[0]

[1]

[2]

[3]

[4]]

>>> print dot(a,b)

[30]

点积的效果更加明显了。

ndarray的几个常用属性:

· shape: 代表一个array的形态,是一个向量还是一个矩阵,抑或是一个更复杂的向量组。

· ndim: 代表这个array的维度

· size: 在array中拥有的元素数量

· itemsize: 这个array中每一个元素所需要占的字节数

· nbytes: 这个array的总字节数(=itemsize*size)

· real: 代表一个array中所有元素的实数部分

· imag: 同理,代表一个array中所有元素的虚数部分

· flat: 将这个array整理成一维的,可以索引的一系列的元素组合。它实际上是通过iterator实现的,我们可以通过for x in array.flat来取得到所有的元素

· T: 矩阵转置,同transpose()方法

一些比较有用的方法:

· tolist(): 将array转化成一个Python中的list对象

· item(*args): 取得某一位置的元素

· dump(file): 将这个对象序列化至文件。同cPickle中的dump作用

· dumps(): 将序列化的结果通过字符串加以输出

一些关于Array的形态操作:

· reshape(): 改变array的形态

· resize(): 也是改变array的形态。不同的是,resize是直接修改这个对象的,而reshape则会生成一个新的对象

· transpose(): 这个就是矩阵的转置操作啦

· swapaxes(): 将n个维度中任意两个维度(坐标轴)进行调换

· flatten(): 复制一个一维的array出来

还有一些关于Array的运算操作:

· max():取得所有元素中的最大值

· min():取得最小值。还有一点值得说,就是max、min这些函数都可以针对某一坐标轴(具体维度)进行运算,例如array.max(axis=0),就在0坐标上求最大值

· sum():求和

· cumsum():求累计和

· prod():求所有元素之积

· cumprod():求累计积

· all():如果所有元素都为真,那么返回真;否则返回假

· any():只要有一个元素为真则返回真

· mean():求平均数

Array高级操作

1. Vectorize函数

def t(x):
return x + 3
a1 = scipy.zeros((5,4))
a1
NumPy array, format: long
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
s = scipy.vectorize(t)
a2 = s(a1)
a2
NumPy array, format: long
[[3 3 3 3]
[3 3 3 3]
[3 3 3 3]
[3 3 3 3]
[3 3 3 3]]

2. NumPy和SciPy相互转化

import numpy
import scipy
a1 = zeros((4,6))
type(a1)
<type 'scipy.ndarray'>
a2 = numpy.asarray(a1)
type(a2)
<type 'numpy.ndarray'>
a3 = numpy.zeros((3,5))
type(a3)
<type 'numpy.ndarray'>
a4 = scipy.asarray(a3)
type(a4)
<type 'scipy.ndarray'>


NumPy 数学函数

Trigonometric functions

sin
(x[, out])
Trigonometric sine, element-wise.
cos
(x[, out])
Cosine elementwise.
tan
(x[, out])
Compute tangent element-wise.
arcsin
(x[, out])
Inverse sine elementwise.
arccos
(x[, out])
Trigonometric inverse cosine, element-wise.
arctan
(x[, out])
Trigonometric inverse tangent, element-wise.
hypot
(x1, x2[, out])
Given two sides of a right triangle, return its hypotenuse.
arctan2
(x1, x2[, out])
Elementwise arc tangent of
x1/x2 choosing the quadrant correctly.
degrees
(x[, out])
Convert angles from radians to degrees. This is the same function as rad2deg but the latter is preferred because of the more descriptive name.
radians
(x[, out])
Convert angles from degrees to radians. This function is the same as deg2rad, which is more descriptive..
unwrap
(p[, discont, axis])
Unwrap by changing deltas between values to 2*pi complement.

Hyperbolic functions

sinh
(x[, out])
Hyperbolic sine, element-wise.
cosh
(x[, out])
Hyperbolic cosine, element-wise.
tanh
(x[, out])
Hyperbolic tangent element-wise.
arcsinh
(x[, out])
Inverse hyperbolic sine elementwise.
arccosh
(x[, out])
Inverse hyperbolic cosine, elementwise.
arctanh
(x[, out])
Inverse hyperbolic tangent elementwise.

Rounding

around
(a[, decimals, out])
Evenly round to the given number of decimals.
round_
(a[, decimals, out])
Round an array to the given number of decimals.
rint
(x[, out])
Round elements of the array to the nearest integer.
fix
(x[, y])
Round to nearest integer towards zero.
floor
(x[, out])
Return the floor of the input, element-wise.
ceil
(x[, out])
Return the ceiling of the input, element-wise.

Sums, products, differences

prod
(a[, axis, dtype, out])
Return the product of array elements over a given axis.
sum
(a[, axis, dtype, out])
Return the sum of array elements over a given axis.
nansum
(a[, axis])
Return the sum of array elements over a given axis treating Not a Numbers (NaNs) as zero.
cumprod
(a[, axis, dtype, out])
Return the cumulative product of elements along a given axis.
cumsum
(a[, axis, dtype, out])
Return the cumulative sum of the elements along a given axis.
diff
(a[, n, axis])
Calculate the nth order discrete difference along given axis.
ediff1d
(ary[, to_end, to_begin])
The differences between consecutive elements of an array.
gradient
(f, *varargs)
Return the gradient of an N-dimensional array.
cross
(a, b[, axisa, axisb, axisc, ...])
Return the cross product of two (arrays of) vectors.
trapz
(y[, x, dx, axis])
Integrate along the given axis using the composite trapezoidal rule.

Exponents and logarithms

exp
(x[, out])
Calculate the exponential of the elements in the input array.
expm1
(x[, out])
Return the exponential of the elements in the array minus one.
log
(x[, out])
Natural logarithm, element-wise.
log10
(x[, out])
Compute the logarithm in base 10 element-wise.
log2
(x[, y])
Return the base 2 logarithm.
log1p
(x[, out])
log(1 + x) in base
e, elementwise.

Other special functions

i0
(x)
Modified Bessel function of the first kind, order 0.
sinc
(x)
Return the sinc function.

Floating point routines

signbit
(x[, out])
Returns element-wise True where signbit is set (less than zero).
frexp
(x[, out1, out2])
Split the number, x, into a normalized fraction (y1) and exponent (y2)
ldexp
(x1, x2[, out])
Compute y = x1 * 2**x2.

Arithmetic operations

add
(x1, x2[, out])
Add arguments element-wise.
reciprocal
(x[, out])
Return element-wise reciprocal.
negative
(x[, out])
Returns an array with the negative of each element of the original array.
multiply
(x1, x2[, out])
Multiply arguments elementwise.
divide
(x1, x2[, out])
Divide arguments element-wise.
power
(x1, x2[, out])
Returns element-wise base array raised to power from second array.
subtract
(x1, x2[, out])
Subtract arguments element-wise.
true_divide
(x1, x2[, out])
Returns an element-wise, true division of the inputs.
floor_divide
(x1, x2[, out])
Return the largest integer smaller or equal to the division of the inputs.
fmod
(x1, x2[, out])
Return the remainder of division.
mod
(x1, x2[, out])
Returns element-wise remainder of division.
modf
(x[, out1, out2])
Return the fractional and integral part of a number.
remainder
(x1, x2[, out])
Returns element-wise remainder of division.

Handling complex numbers

angle
(z[, deg])
Return the angle of the complex argument.
real
(val)
Return the real part of the elements of the array.
imag
(val)
Return the imaginary part of array.
conj
(x[, out])
Return the complex conjugate, element-wise.

Miscellaneous

convolve
(a, v[, mode])
Returns the discrete, linear convolution of two one-dimensional sequences.
clip
(a, a_min, a_max[, out])
Clip (limit) the values in an array.
sqrt
(x[, out])
Return the positive square-root of an array, element-wise.
square
(x[, out])
Return the element-wise square of the input.
absolute
(x[, out])
Calculate the absolute value element-wise.
fabs
(x[, out])
Compute the absolute values elementwise.
sign
(x[, out])
Returns an element-wise indication of the sign of a number.
maximum
(x1, x2[, out])
Element-wise maximum of array elements.
minimum
(x1, x2[, out])
Element-wise minimum of array elements.
nan_to_num
(x)
Replace nan with zero and inf with large numbers.
real_if_close
(a[, tol])
If complex input returns a real array if complex parts are close to zero.
interp
(x, xp, fp[, left, right])
One-dimensional linear interpolation.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: