微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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基本函数方法一览

arangearraycopyemptyempty_likeeyefromfilefromfunctionidentitylinspacelogspacemgridogridonesones_likerzeros,zeros_like

Conversions

ndarray.astypeatleast_1datleast_2datleast_3dmat

Manipulations

array_splitcolumn_stackconcatenatediagonaldsplitdstackhsplithstackndarray.itemnewaxisravelrepeatreshaperesize,squeezeswapaxestaketransposevsplitvstack

Questionsallanynonzerowhere

Ordering

argmaxargminargsortmaxminptpsearchsortedsort

Operations

choosecompresscumprodcumsuminnerndarray.fillimagprodputputmaskrealsum

Basic Statistics

covmeanstdvar

Basic Linear Algebra

crossdotouterlinalg.svdvdot

完整的函数方法一览表链接

https://docs.scipy.org/doc/numpy-dev/reference/routines.html#routines

9. 特殊的索引技巧

a = np.arange(12)**2
输出:
array([ 0,81,100,121])
i = np.array([1,5])
a[i]
输出:
array([ 1,64,25])

j = np.array([[3,[9,7]])
a[j]
输出:
array([[ 9,16],[81,49]])


palette = np.array([[0,[255,255,255],255]])
image = np.array([[0,0]])
palette[image]
输出:
array([[[ 0,[ 0,0]],[[ 0,0]]])


i = np.array([[0,2]])
j = np.array([[2,3]])
a[i,j]
输出:
array([[ 2,[ 7,11]])
l = [i,j]
a[l]
输出:
array([[ 2,11]])


a[i,2]
输出:
array([[ 2,10]])

a[:,j]
输出:
array([[[ 2,3]],[[ 6,7]],[[10,9],[11,11]]])

s = np.array([i,j])
print(s)
array([[[0,2]],[[2,3]]])

a[tuple(s)]
输出:
array([[ 2,11]])
print(tupe(s))
输出:
(array([[0,2]]),array([[2,3]]))

10. 寻找最大值/最小值及其对应索引值

time = np.linspace(20,145,5)
输出:
 array([ 20.,51.25,82.5,113.75,145. ])

data = np.sin(np.arange(20)).reshape(5,4)
输出:
array([[ 0.,0.84147098,0.90929743,0.14112001],[-0.7568025,-0.95892427,-0.2794155,0.6569866 ],[ 0.98935825,0.41211849,-0.54402111,-0.99999021],[-0.53657292,0.42016704,0.99060736,0.65028784],[-0.28790332,-0.96139749,-0.75098725,0.14987721]])

ind = data.argmax(axis=0)
输出:
array([2,dtype=int64)

time_max = time[ind]
输出:
array([ 82.5,20.,51.25])

data_max = data[ind,xrange(data.shape[1])]
输出:
array([ 0.98935825,0.6569866 ])

np.all(data_max == data.max(axis=0))
输出:
True

 

a = np.arange(5)
a[[1,4]] = 0
print(a)
输出:
array([0,0])
a = np.arange(5)
a[[0,2]] = [1,3]
print(a)
输出:
array([2,4])


a = np.arange(5)
a[[0,2]] += 1
print(a)
输出:
array([1,4])
a = np.arange(12).reshape(3,4)
 b = a > 4
输出:
array([[False,False,False],[False,[ True,True]],dtype=bool)

a[b]
输出:
array([ 5,11])

a[b] = 0
print(a)
输出:
array([[0,0]])
a = np.arange(12).reshape(3,4)
b1 = np.array([False,True])
b2 = n.array([True,False])
a[b1,:]
输出:
array([[ 4,11]])

a[b1]
输出:
array([[ 4,11]])

a[:,b2]
输出:
array([[ 0,10]])

a[b1,b2]
输出:
array([ 4,10])

11. ix_() function

a = np.array([2,5])
b = np.array([8,4])
c = np.array([5,3])
ax,bx,cx = np.ix_(a,b,c)
print(ax) # (4L,1L,1L)
输出:
array([[[2]],[[3]],[[4]],[[5]]])
print(bx) # (1L,3L,1L)
输出:
array([[[8],[5],[4]]])
print(cx) # (1L,5L)
输出:
array([[[5,3]]])


result = ax + bx*cx
输出:
array([[[42,34,50,66,26],[27,32,42,17],[22,26,14]],[[43,35,51,67,27],[28,23,33,43,18],[23,19,15]],[[44,36,52,68,28],[29,24,44,[24,28,16]],[[45,37,53,69,29],[30,25,45,20],[25,29,17]]])

result[3,4]
输出:17

12. 线性代数运算

a = np.array([[1.,[3.,4.]])
a.transpose() # 转置
np.linalg.inv(a) # 求逆
u = np.eye(2) # 产生单位矩阵
np.dot(a,a) # 矩阵乘积
np.trace(a) # 求矩阵的迹
y = np.array([5.],[7.]])
np.linalg.solve(a,y) # 求解线性方程组
np.linalg.eig(a) # 特征分解

“Automatic” Reshaping

a = np.arange(30)
a.shape = 2,-1,3
a.shape # (2L,5L,3L)
print(a)
array([[[ 0,11],[[15,16,[18,[21,23],29]]])
x = np.arange(0,2)
y = np.arange(5)
m = np.vstack([x,y])
输出:
array([[0,4]])
n = np.hstack([x,y])
输出:
array([0,4])

13. 矩阵的创建

a = np.array([1,3])
a1 = np.mat(a)
输出:
matrix([[1,3]])
type(a1)
输出:
numpy.matrixlib.defmatrix.matrix
a1.shape
输出:
(1L,3L)
a.shape
输出:
(3L,)

b=np.matrix([1,3])
输出:
matrix([[1,3]])

from numpy import *
data1 = mat(zeros((3,3)))
data2 = mat(ones((2,4)))
data3 = mat(random.rand(2,2))
data4 = mat(random.randint(2,size=(2,5)))
data5 = mat(eye(2,dtype=int))

14. 常见的矩阵运算

a1 = mat([1,2])
a2 = mat([[1],[2]])
a3 = a1 * a2
print(a3)
输出:
matrix([[5]])

print(a1*2)
输出:
matrix([[2,4]])

a1 = mat(eye(2,2)*0.5)
print(a1.I)
输出:
matrix([[ 2.,2.]])


a1 = mat([[1,[2,2]])
a1.sum(axis=0)
输出:
matrix([[7,7]])
a1.sum(axis=1)
输出:
matrix([[3],[6]])
a1.max() # 求矩阵元素最大值
输出:
4
a1.min() # 求矩阵元素最小值
输出:
1

np.max(a1,0) # 求矩阵每列元素最大值
输出:
matrix([[4,3]])
np.max(a1,1) # 求矩阵每行元素最大值
输出:
matrix([[2],[3],[4]])


a = mat(ones((2,2)))
b = mat(eye((2)))
c = hstack((a,b))
输出:
matrix([[ 1.,[ 1.,1.]])
d = vstack((a,1.]])

15. 矩阵、数组、列表之间的互相转换

aa = [[1,[5,6]]
bb = array(aa)
cc = mat(bb)

cc.getA() # 矩阵转换为数组
cc.tolist() # 矩阵转换为列表
bb.tolist() # 数组转换为列表


# 当列表为一维时,情况有点特殊
aa = [1,4]
bb = array(aa)
输出:
array([1,4])
cc = mat(bb)
输出:
matrix([[1,4]])

cc.tolist()
输出:
[[1,4]]

bb.tolist()
输出:
[1,4]

cc.tolist()[0]
输出:
[1,4]

内容整理参考链接如下:

https://docs.scipy.org/doc/numpy-dev/user/quickstart.html

http://python.usyiyi.cn/translate/NumPy_v111/reference/arrays.scalars.html#arrays-scalars-built-in

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用爬虫利器 Playwright,轻松爬取抖查查数据 我们先分析登录的接口,其中 url 有一些非业务参数:ts、he、sign、secret。 然后根据这些参数作为关键词,定位到相关的 js 代码。 最后,逐步进行代码的跟踪,发现大部分的代码被混淆加密了。 花费了大半天,来还原这些混淆加密的代码
轻松爬取灰豚数据的抖音商品数据 调用两次登录接口实现模拟登录 我们分析登录接口,发现调用了两次不同的接口;而且,需要先调用 https://login.huitun.com/weChat/userLogin,然后再调用 https://dyapi.huitun.com/userLogin 接口。 登
成功绕过阿里无痕验证码,一键爬取飞瓜数据 飞瓜数据的登录接口,接入了阿里云的无痕验证码;通过接口方式模拟登录,难度比较高。所以,我们使用自动化的方式来实现模拟登录,并且获取到 cookie 数据。 [阿里无痕验证码] https://help.aliyun.com/document_detail/1
一文教你从零开始入门蝉妈妈数据爬取,成功逆向破解数据加密算法 通过接口进行模拟登录 我们先通过正常登录的方式,分析对应的登录接口。通过 F12 打开谷歌浏览器的调试面板,可以看到登录需要传递的一些参数;其中看到密码是被加密了。 不过我们通过经验可以大概猜测一下,应该是通过 md5 算法加密了。 接下
抽丝剥茧成功破解红人点集的签名加密算法 抽丝剥茧破解登录签名算法,成功实现模拟登录 headers = {} phone_num = &quot;xxxx&quot; password = &quot;xxxx&quot; md5_hash = hashlib.md5() md5_hash.upda
轻松绕过 Graphql 接口爬取有米有数的商品数据 有米有数数据的 API 接口,使用的是一种 API 查询语言 graphql。所有的 API 只有一个入口,具体的操作隐藏在请求数据体里面传输。 模拟登录,获取 sessionId 调用登录接口,进行模拟登录。 cookies = {} head
我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多小问题,都解决了,记录一下踩过的坑。 1、Pyinstaller打包过程当中出现warning,跟d
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Pooling在中文当中的意思是“池化”,在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体操作如下图: 结合图像理解,相信你也会大概明白其中的本意。不过Pooling并不是只可以选取2x2的窗口大小,即便是3x3,
记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码: 相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic histogram2. 数据分布与密度信息显示 Control rug and density on seaborn histogram3. 带箱形图的直方图 Histogram with a boxplot on t