加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python中numpy的矩阵、多维数组的用法

发布时间:2020-05-25 10:53:48 所属栏目:Python 来源:互联网
导读:1.引言最近在将一个算法由matlab转成python,初学python,很多地方还不熟悉,总体感觉就是上手容易,实际上很优雅地用python还是蛮难的。目前为止,觉得就算法仿真研究而言,还是matlab用得特别舒服,可能是比较熟悉

1. 引言

最近在将一个算法由matlab转成python,初学python,很多地方还不熟悉,总体感觉就是上手容易,实际上很优雅地用python还是蛮难的。目前为止,觉得就算法仿真研究而言,还是matlab用得特别舒服,可能是比较熟悉的缘故吧。matlab直接集成了很多算法工具箱,函数查询、调用、变量查询等非常方便,或许以后用久了python也会感觉很好用。与python相比,最喜欢的莫过于可以直接选中某段代码执行了,操作方便,python也可以实现,就是感觉不是很方便。

言归正传,做算法要用到很多的向量和矩阵运算操作,这些嘛在matlab里面已经很熟悉了,但用python的时候需要用一个查一个,挺烦的,所以在此稍作总结,后续使用过程中会根据使用体验更新。

python的矩阵运算主要依赖numpy包,scipy包以numpy为基础,大大扩展了后者的运算能力。

2. 创建一般的多维数组

import numpy as np

a = np.array([1,2,3],dtype=int) # 创建1*3维数组 array([1,3])

type(a) # numpy.ndarray类型

a.shape # 维数信息(3L,)

a.dtype.name # 'int32'

a.size # 元素个数:3

a.itemsize #每个元素所占用的字节数目:4

b=np.array([[1,[4,5,6]],dtype=int) # 创建2*3维数组 array([[1,6]])

b.shape # 维数信息(2L,3L)

b.size # 元素个数:6

b.itemsize # 每个元素所占用的字节数目:4


c=np.array([[1,dtype='int16') # 创建2*3维数组 array([[1,dtype=int16)

c.shape # 维数信息(2L,3L)

c.size # 元素个数:6

c.itemsize # 每个元素所占用的字节数目:2

c.ndim # 维数

 
d=np.array([[1,dtype=complex) # 复数二维数组

d.itemsize # 每个元素所占用的字节数目:16

d.dtype.name # 元素类型:'complex128'

3. 创建特殊类型的多维数组 

a1 = np.zeros((3,4)) # 创建3*4全零二维数组

输出:

array([[ 0.,0.,0.],[ 0.,0.]])

a1.dtype.name # 元素类型:'float64'

a1.size # 元素个数:12

a1.itemsize # 每个元素所占用的字节个数:8

 

 

a2 = np.ones((2,3,4),dtype=np.int16) # 创建2*3*4全1三维数组

a2 = np.ones((2,dtype='int16')  # 创建2*3*4全1三维数组

输出:

array([[[1,1,1],[1,1]],[[1,1]]],dtype=int16)

 

 

a3 = np.empty((2,3)) # 创建2*3的未初始化二维数组

输出:(may vary)

array([[ 1.,2.,3.],[ 4.,5.,6.]])



a4 = np.arange(10,30,5) # 初始值10,结束值:30(不包含),步长:5

输出:array([10,15,20,25])

a5 = np.arange(0,0.3) # 初始值0,结束值:2(不包含),步长:0.2

输出:array([ 0.,0.3,0.6,0.9,1.2,1.5,1.8])


from numpy import pi

np.linspace(0,9) # 初始值0,结束值:2(包含),元素个数:9

输出:

array([ 0.,0.25,0.5,0.75,1.,1.25,1.75,2. ])

x = np.linspace(0,2*pi,9)

输出:

array([ 0.,0.78539816,1.57079633,2.35619449,3.14159265,3.92699082,4.71238898,5.49778714,6.28318531])

a = np.arange(6)

输出:

array([0,4,5])

b = np.arange(12).reshape(4,3)

输出:

array([[ 0,2],[ 3,5],[ 6,7,8],[ 9,10,11]])

c = np.arange(24).reshape(2,4)

输出:

array([[[ 0,[ 4,6,7],[ 8,9,11]],[[12,13,14,15],[16,17,18,19],[20,21,22,23]]])  

使用numpy.set_printoptions可以设置numpy变量的打印格式

在ipython环境下,使用help(numpy.set_printoptions)查询使用帮助和示例

4. 多维数组的基本操作

加法和减法操作要求操作双方的维数信息一致,均为M*N为数组方可正确执行操作。

a = np.arange(4)

输出:

array([0,3])

b = a**2

输出:

array([0,9])

c = 10*np.sin(a)

输出:

 array([ 0.,8.41470985,9.09297427,1.41120008])

 

 

n < 35

输出:

array([ True,True,True],dtype=bool)

 

A = np.array([[1,[0,1]])

B = np.array([[2,0],[3,4]])

C = A * B # 元素点乘

输出:

array([[2,4]])

D = A.dot(B) # 矩阵乘法

输出:

array([[5,4],4]])

E = np.dot(A,B) # 矩阵乘法

输出:

array([[5,4]])

多维数组操作过程中的类型转换

When operating with arrays of different types,the type of the resulting array corresponds to the more general or precise one (a behavior known as upcasting)

即操作不同类型的多维数组时,结果自动转换为精度更高类型的数组,即upcasting

a = np.ones((2,3),dtype=int)  # int32

b = np.random.random((2,3))  # float64

b += a # 正确 

a += b # 错误 
a = np.ones(3,dtype=np.int32)

b = np.linspace(0,pi,3)

c = a + b

d = np.exp(c*1j)

输出:

array([ 0.54030231+0.84147098j,-0.84147098+0.54030231j,-0.54030231-0.84147098j])

d.dtype.name

输出:

 'complex128' 

多维数组的一元操作,如求和、求最小值、最大值等

a = np.random.random((2,3))

a.sum()

a.min()

a.max()

 

 

b = np.arange(12).reshape(3,4)

输出:

array([[ 0,11]])

b.sum(axis=0) # 按列求和

输出:

array([12,21])

b.sum(axis=1) # 按行求和

输出:

array([ 6,38])

b.cumsum(axis=0) # 按列进行元素累加

输出:

array([[ 0,8,10],[12,21]])

b.cumsum(axis=1) # 按行进行元素累加

输出:

array([[ 0,6],22],27,38]]) 


universal functions


B = np.arange(3)

np.exp(B)

np.sqrt(B)

C = np.array([2.,-1.,4.])

np.add(B,C) 

其他的ufunc函数包括:

all,any,apply_along_axis,argmax,argmin,argsort,average,bincount,ceil,clip,conj,corrcoef,cov,cross,cumprod,cumsum,diff,dot,floor,inner,lexsort,max,maximum,mean,median,min,minimum,nonzero,outer,prod,re,round,sort,std,sum,trace,transpose,var,vdot,vectorize,where

5. 数组索引、切片和迭代

a = np.arange(10)**3

a[2]

a[2:5]

a[::-1] # 逆序输出

for i in a:

 print (i**(1/3.)) 

def f(x,y):

 return 10*x+y

b = np.fromfunction(f,(5,dtype=int)

b[2,3]

b[0:5,1]

b[:,1]

b[1:3,:]

b[-1] 
c = np.array([[[0,[10,11,12]],[[100,101,102],[110,111,112]]])

输出:

array([[[ 0,[ 10,112]]])

c.shape

输出:

(2L,2L,3L)

c[0,...]

c[0,:,:]

输出:

array([[ 0,12]])

c[:,2]

c[...,2]

输出:

array([[ 2,12],[102,112]])

 

for row in c:

 print(row)

 

for element in c.flat:

 print(element) 

a = np.floor(10*np.random.random((3,4)))

输出:

array([[ 3.,9.,8.,4.],[ 2.,4.,6.],6.,2.]])

a.ravel()

输出:

array([ 3.,...,2.])

a.reshape(6,2)

输出:

array([[ 3.,9.],[ 8.,1.],2.]])

a.T

输出:

array([[ 3.,[ 9.,2.]])

a.T.shape

输出:

(4L,3L)

a.resize((2,6))

输出:

array([[ 3.,2.]])

a.shape

输出:

(2L,6L)

a.reshape(3,-1)

输出:

array([[ 3.,2.]]) 

详查以下函数:

ndarray.shape,reshape,resize,ravel

6. 组合不同的多维数组

a = np.floor(10*np.random.random((2,2)))

输出:

array([[ 5.,2.],[ 6.,2.]])

b = np.floor(10*np.random.random((2,2)))

输出:

array([[ 0.,1.]])

np.vstack((a,b))

输出:

array([[ 5.,1.]])

np.hstack((a,1.]])

 

 

from numpy import newaxis

np.column_stack((a,1.]])

 

 

a = np.array([4.,2.])

b = np.array([2.,8.])

a[:,newaxis]

输出:

array([[ 4.],[ 2.]])

b[:,newaxis]

输出:

array([[ 2.],[ 8.]])

np.column_stack((a[:,newaxis],b[:,newaxis]))

输出:

array([[ 4.,8.]])

np.vstack((a[:,newaxis]))

输出:

array([[ 4.],[ 2.],[ 8.]])

np.r_[1:4,4]

输出:

array([1,4])

np.c_[np.array([[1,3]]),np.array([[4,6]])]

输出:

array([[1,6]]) 

详细使用请查询以下函数:

hstack,vstack,column_stack,concatenate,c_,r_

7. 将较大的多维数组分割成较小的多维数组

a = np.floor(10*np.random.random((2,12)))

输出:

array([[ 9.,7.,3.,[ 5.,7.]])

np.hsplit(a,3)

输出:

[array([[ 9.,1.]]),array([[ 7.,[ 7.,2.]]),array([[ 9.,[ 3.,7.]])]

np.hsplit(a,(3,4))

输出:

[array([[ 9.,3.]]),array([[ 6.],[ 1.]]),7.]])] 

实现类似功能的函数包括:

hsplit,vsplit,array_split

8.  多维数组的复制操作

a = np.arange(12)

输出:

array([ 0,11])

 

not copy at all

 

b = a

b is a # True

b.shape = 3,4

a.shape # (3L,4L)

 

def f(x) # Python passes mutable objects as references,so function calls make no copy.

 print(id(x)) # id是python对象的唯一标识符

 

id(a) # 111833936L

id(b) # 111833936L

f(a)  # 111833936L

 

 

浅复制
c = a.view()

c is a # False

c.base is a # True

c.flags.owndata # False

c.shape = 2,6

a.shape # (3L,4L)

c[0,4] = 1234

print(a)

输出:

array([[ 0,[1234,11]])

s = a[:,1:3]

s[:] = 10

print(a)

输出:

array([[ 0,11]])

 

 

深复制
d = a.copy()

d is a # False

d.base is a # False

d[0,0] = 9999

print(a)

输出:

array([[ 0,11]]) 

numpy基本函数和方法一览

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读