42-python中的矩阵多维数组----numpy

Posted ystraw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了42-python中的矩阵多维数组----numpy相关的知识,希望对你有一定的参考价值。

python中的矩阵、多维数组----numpy

1. 引言

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

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

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

2. 创建一般的多维数组 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import numpy as np
= np.array([1,2,3], dtype=int)  # 创建1*3维数组   array([1,2,3])
type(a)  # numpy.ndarray类型
a.shape  # 维数信息(3L,)
a.dtype.name   # \'int32\'
a.size   # 元素个数:3
a.itemsize  #每个元素所占用的字节数目:4
 
 
b=np.array([[1,2,3],[4,5,6]],dtype=int)  # 创建2*3维数组  array([[1,2,3],[4,5,6]])
b.shape  # 维数信息(2L,3L)
b.size   # 元素个数:6
b.itemsize   # 每个元素所占用的字节数目:4
 
 
c=np.array([[1,2,3],[4,5,6]],dtype=\'int16\')  # 创建2*3维数组  array([[1,2,3],[4,5,6]],dtype=int16)
c.shape  # 维数信息(2L,3L)
c.size   # 元素个数:6
c.itemsize   # 每个元素所占用的字节数目:2
c.ndim  # 维数
 
 
d=np.array([[1,2,3],[4,5,6]],dtype=complex)    #  复数二维数组
d.itemsize  # 每个元素所占用的字节数目:16
d.dtype.name  # 元素类型:\'complex128\'

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
a1 = np.zeros((3,4))    # 创建3*4全零二维数组
输出:
array([[ 0.,  0.,  0.,  0.],
       0.,  0.,  0.,  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,3,4), dtype=\'int16\')     # 创建2*3*4全1三维数组
输出:
array([[[1111],
        [1111],
        [1111]],
 
       [[1111],
        [1111],
        [1111]]], 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([10152025])
a5 = np.arange(0,2,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(029)   # 初始值0,结束值:2(包含),元素个数:9
输出:
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ])
= np.linspace(02*pi, 9)
输出:
array([ 0.        ,  0.78539816,  1.57079633,  2.35619449,  3.14159265,
        3.92699082,  4.71238898,  5.49778714,  6.28318531])
 
 
= np.arange(6)
输出:
array([012345])
= np.arange(12).reshape(4,3)
输出:
array([[ 0,  1,  2],
       3,  4,  5],
       6,  7,  8],
       91011]])
= np.arange(24).reshape(2,3,4)
输出:
array([[[ 0,  1,  2,  3],
        4,  5,  6,  7],
        8,  91011]],
 
       [[12131415],
        [16171819],
        [20212223]]]) 

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

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

4. 多维数组的基本操作

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
= np.arange(4)
输出:
array([0123])
= a**2
输出:
array([0149])
= 10*np.sin(a)
输出:
 array([ 0.        ,  8.41470985,  9.09297427,  1.41120008])
 
 
n < 35
输出:
array([ True,  True,  True,  True], dtype=bool)
 
= np.array([[1,1],[0,1]])
= np.array([[2,0],[3,4]])
= * B    # 元素点乘
输出:
array([[20],
       [04]])
= A.dot(B)   # 矩阵乘法
输出:
array([[54],
       [34]])
= np.dot(A,B)   # 矩阵乘法
输出:
array([[54],
       [34]])

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

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

1
2
3
4
= np.ones((2,3),dtype=int)      # int32
= np.random.random((2,3))     # float64
+= a  # 正确
+= b  # 错误
1
2
3
4
5
6
7
8
9
10
= np.ones(3,dtype=np.int32)
= np.linspace(0,pi,3)
= + b
= np.exp(c*1j)
输出:
array([ 0.54030231+0.84147098j-0.84147098+0.54030231j,
       -0.54030231-0.84147098j])
d.dtype.name
输出:
 \'complex128\'

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
= np.random.random((2,3))
a.sum()
a.min()
a.max()
 
 
= np.arange(12).reshape(3,4)
输出:
array([[ 0,  1,  2,  3],
       4,  5,  6,  7],
       8,  91011]])
b.sum(axis=0)    # 按列求和
输出:
array([12151821])
b.sum(axis=1)    # 按行求和
输出:
array([ 62238])
b.cumsum(axis=0)   # 按列进行元素累加
输出:
array([[ 0,  1,  2,  3],
       4,  6,  810],
       [12151821]])
b.cumsum(axis=1)   # 按行进行元素累加
输出:
array([[ 0,  1,  3,  6],
       4,  91522],
       8172738]])

universal functions

1
2
3
4
5
= np.arange(3)
np.exp(B)
np.sqrt(B)
= np.array([2.,-1.,4.])
np.add(B,C)

其他的ufunc函数包括:

allanyapply_along_axisargmaxargminargsortaveragebincountceilclipconjcorrcoefcovcrosscumprodcumsumdiffdotfloor,innerlexsortmaxmaximummeanmedianminminimumnonzeroouterprodreroundsortstdsumtracetransposevar,Nump库的基本使用

R中的多维稀疏数组(3路张量)

python中的矩阵多维数组----numpy

一个管理多维数组的类!如何管理单元格中的不同数据类型?

Python: 向量矩阵和多维数组(基于NumPy库)

在c中的结构中初始化多维数组