python 科学计算 — numpy 学习笔记

python numpy的学习笔记

要使用numpy,首先需要import进来:

建议使用别名np,因为你会发现这几乎是一个大家都在用的写法!

import numpy as np

 

一、创建数组

1.和list类似,可以直接用arange来表示范围:

import numpy as np
a = np.arange(10)
print a

Output:

[0 1 2 3 4 5 6 7 8 9]

 

从[2,20)间隔为3的等差数列

import numpy as np
a = np.arange(2,20,3)
print a

Output:

[ 2  5  8 11 14 17]

 

 

类似arange,linspace从[start , stop ] 生成num个数,Num个数间隔相等。(默认为float)

linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

print np.linspace(0, 2, 9)

Output:

[ 0.    0.25  0.5   0.75  1.    1.25  1.5   1.75  2.  ]

 

 

2.用list/tuple创建数组(list也可以是二维的)

import numpy as np
a = np.array([range(5)])
print a

 

3.快速生成x*y的全零数组

d=(2,3) #(2,3,4)变为3维
print np.zeros(d)

Output:

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

 

默认生成的类型是浮点型
可以用dtype改为int

d = (4, 5)
print np.ones(d, dtype=int)

还可以通过zeros_like生成相同形状的全0数组,如:

img = np.zeros_like(image)

 

0~1的随机数:

np.random.rand(5)

 

3.一维转化为二维数组 reshape

a= np.arange(10)
a = a.reshape(2, 5)
print a

 

Output:

[[0 1 2 3 4]
 [5 6 7 8 9]]

PS:

这个会根据列来自动适应行!

下面这句在a=np.arange(10)等价于a = a.reshape(2, 5)

在a=np.arange(20)等价于a = a.reshape(4, 5)!

a.reshape(-1, 5)

 

甚至可以转化为更高维的:

import numpy as np
a = np.arange(20)
a = a.reshape(2,2,5)
print a

Output:

[[[ 0  1  2  3  4]
  [ 5  6  7  8  9]]

 [[10 11 12 13 14]
  [15 16 17 18 19]]]

 

当然,也可以二维转化一维的:ravel

import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print np.ravel(a)

Output:

[1 2 3 4 5 6]

 

 

4. 切割vsplit和hsplit

vsplit和hsplit用法差不多,差别在于:vsplit来进行分行,而hsplit来分列(即作用于同一行中)。

numpy.vsplit(ary, indices_or_sections)

(1)指定切分个数(需要行数能被切分的个数整除)

看下面的代码,生成了6*3的数组,用vsplit切分为3个。

import numpy as np
a = np.arange(18).reshape(-1,3)
print a,'\n'
print np.vsplit(a,3)

Output:

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

[array([[0, 1, 2],
       [3, 4, 5]]), array([[ 6,  7,  8],
       [ 9, 10, 11]]), array([[12, 13, 14],
       [15, 16, 17]])]

 

(2)指定位置切分

我只改动了最后一行,将vsplit第二个参数改为一个List,来指定切分的位置。

import numpy as np
a = np.arange(18).reshape(-1,3)
print a,'\n'
print np.vsplit(a,[1,5])

Output:

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

[array([[0, 1, 2]]), array([[ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [12, 13, 14]]), array([[15, 16, 17]])]

 

5.查看数组属性

ndim :维度
shape:各维度的大小
size:全部的元素个数
dtype:查看元素类型
type:数组的类型

import numpy as np
a = np.arange(20)
a = a.reshape(2,2,5)
print a.ndim    #a的维度
print a.shape   #a的各维度的大小
print a.size    #a的全部的元素个数
print a.dtype   #a的元素类型
print type(a)   #a的类型

Output:

3
(2L, 2L, 5L)
20
int32
<type 'numpy.ndarray'>

 

二、数组操作

1.四则运算

+’,’-‘,’*’,’/’运算都是基于全部的数组元素的

import numpy as np
a = np.array([1,2])
b= np.array([3,4])
print a+b

Output:

[4 6]

 

2.开根号/指数

import numpy as np
a = np.array([1,2])
print np.sqrt(a)    
print np.exp(a)     
print np.square(a)
print np.power(a,5)
print a ** 5        #可以用Power也可以直接 ** ,当然这么写比较爽

Output:

[ 1.          1.41421356]
[ 2.71828183  7.3890561 ]
[1 4]
[ 1 32]
[ 1 32]

 

3.数组最大最小值

import numpy as np
a = np.arange(20).reshape(4,5)
print a
print a.min()
print a.max()
print a.sum()
print a.min(axis=0) #minimun element in each column
print a.min(axis=1) #minimun element in each row

Output:

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]
0
19
190
[0 1 2 3 4]
[ 0  5 10 15]

numpy.ptp(a, axis=None, out=None)

返回最大和最小值之差

 

 

4.数组的均值/中位数

import numpy
a =range(5) +[1000]
print a
print numpy.mean(a),numpy.median(a)

Output:

[0, 1, 2, 3, 4, 1000]
168.333333333 2.5

 

5.数组取值

可以直接用下标对齐取值,注意直接赋值的话是浅拷贝!(即a赋给b,意味着b指向了a对应数据的内存地址)

想要真正的复制一份a给b,可以使用copy:

# -*- coding:utf-8 -*-
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = a           #浅拷贝!
c = a.copy()  #深拷贝 np.copy(a)
print a[1,1],a[1][1] 
b[1][1]=5
print a[1][1],b[1][1],c[1][1]

Output:

4 4
5 5 4

 

利用’:’可以访问到某一维的全部数据:

# -*- coding:utf-8 -*-
import numpy as np
a = np.arange(20).reshape(4, 5)
print a
print '\n',a[:,[1,3]] #取出a的每一行的第2个和第4个元素
print '\n',a[:,2][a[:,0] > 5] #取出a中的第3列的元素,如果该行第1个元素 >5

Output:

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]

[[ 1  3]
 [ 6  8]
 [11 13]
 [16 18]]

[12 17]

 

6.数组拼接

使用hstack 横向拼接

使用vstack 纵向拼接

import numpy as np
import numpy.linalg as nlg
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.hstack([a,b])
d = np.vstack([a,b])
print c
print d

Output:

[1 2 3 4 5 6]
[[1 2 3]
 [4 5 6]]

 

 

 

三、矩阵对象

矩阵对象和数组的主要有两点差别:

  • 矩阵是二维的,而数组的可以是任意正整数维
  • 矩阵的’*’操作符进行的是矩阵乘法,乘号左侧的矩阵列和乘号右侧的矩阵行要相等,而在数组中’*’操作符进行的是每一元素的对应相乘,乘号两侧的数组每一维大小需要一致

1.创建矩阵

# -*- coding:utf-8 -*-
import numpy as np
a = np.arange(5)
a = np.mat(a)  #use np.mat(a) or np.asmatrix(a)
print a,type(a)

b = np.mat('1.0 2.0; 3.0 4.0') # you can use np.matrix()
print b,type(b)

Output:

[[0 1 2 3 4]] <class 'numpy.matrixlib.defmatrix.matrix'>
[[ 1.  2.]
 [ 3.  4.]] <class 'numpy.matrixlib.defmatrix.matrix'>

 

2.矩阵乘法

为了比较和数组的乘法,特地将b设为单位阵。

# -*- coding:utf-8 -*-
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[1, 0], [0, 1]])
print 'a=', a, '\nb=', b
print
print 'array : a*b:'
print a * b
print 'matrix: a*b:'
print np.asmatrix(a) * np.asmatrix(b)

Output:

a= [[1 2]
 [3 4]] 
b= [[1 0]
 [0 1]]

array : a*b:
[[1 0]
 [0 4]]
matrix: a*b:
[[1 2]
 [3 4]]

 

3.矩阵转置

# -*- coding:utf-8 -*-
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
print np.transpose(a)   #对于数组,用transpose
print np.matrix(a).T    #对于矩阵,直接T

Output:

[[1 4]
 [2 5]
 [3 6]]
[[1 4]
 [2 5]
 [3 6]]

 

4.矩阵求逆

import numpy as np
import numpy.linalg as nlg
a = np.mat([[1,2],[4,4]]) 
print a
b = nlg.inv(a)
print a*b

Output:

[[1 2]
 [4 4]]
[[ 1.  0.]
 [ 0.  1.]]

 

5.特征值和特征向量

import numpy as np
import numpy.linalg as nlg
a = np.random.rand(3,3)
eig_value, eig_vector = nlg.eig(a)
print "eigen value:"
print eig_value
print "eigen vector:"
print eig_vector

Output:

eigen value:
[ 1.35205837 -0.22652725  0.12474347]
eigen vector:
[[-0.66475046 -0.42263921  0.031526  ]
 [-0.54161542  0.70097608 -0.45506146]
 [-0.51454792 -0.57446378  0.88990178]]

 

 

四、其它

1.缺失值处理

NumPy用nan作为缺失值,可以用isnan判定:

import numpy as np
a = np.random.rand(2,2)
a[0, 1] = np.nan
print np.isnan(a)

nan_to_num()可用来将nan替换成0

 2.统计函数

np.bincount(a):对整数数组中各个元素出现的次数进行统计,它要求数组中所有元素都是非负的,返回值中,第i个元素表示第i个元素在a中出现的次数。

 3.比较函数

直接用==比较

  • 对于相同长度的,返回一个numpy数组,每个元素为相应位置上是否相等.
  • 长度不相同,返回False
import numpy as np
a = np.arange(5)
b = np.array([0,1,2,4,3])
print a==b
print a==np.array([0,1,2,4,3,5])

Output:

[ True  True  True False False]
False

 

 

参考资料:

 

 

本博客若无特殊说明则由 hrwhisper 原创发布
转载请点名出处:细语呢喃 > python 科学计算 — numpy 学习笔记
本文地址:https://www.hrwhisper.me/learning-notes-for-python-numpy/

您的支持将鼓励我继续创作!

python learning , . permalink.

3 thoughts on “python 科学计算 — numpy 学习笔记

  1. 提示Traceback (most recent call last): File “”, line 1, in ImportError: No module named ‘numpy’怎么破?

Leave a Reply

Your email address will not be published. Required fields are marked *