抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Python使用NumPy包完成了对N维数组的快速便捷操作. SciPy包以NumPy包为基础, 扩展了numpy的能力.
SciPy在最外层命名空间中包括了所有的NumPy内容,使用时仅需import scipy, 而不必再单独 import numpy.
numpy的基本类型是数组(array), 矩阵(maxtix)类为array的子类, 继承了其一切特性.

import numpy as np

I 数组创建

1.1 直接创建(np.array)

建立一个一维数组:

a1 = np.array([1,2,3])

建立一个二维数组:

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

将列表转换为数组

b = [[1, 2, 3],[4, 5, 6]]
a3 = np.array(b)

数组类型只支持一种数据类型的存储, 当混合多种数据类型创建数组时, 将自动转换为元素中最高级别类型. 类型级别排序如下:
整数<浮点数<字符串

1.2 特殊矩阵创建

此处使用矩阵的说法但通过下列函数创建的对象其数据类型仍未array, 使用矩阵名称因为称呼方便

创建一个2行3列(2*3)全为0矩阵:(参数是一个tuple 因此有两个括号)

b1 = np.zeros((2,3)) 
# 参数是一个tuple 因此有两个括号

创建一个3*4使用随机数填充的矩阵

b2 = empty((3,4))

创建一个n阶单位方阵:

b2 = np.identity(n)
# 只能创建二位数组

创建一个n阶对角线为1的矩阵 k用于指示对角线位置,可省略

b3 = np.eye(n,k=0)

like系列

通过已知矩阵的行列数创建指定类型矩阵:

zeros_like(A)
empty_like(A)
ones_like(A)

1.3 数组创建

1.3.1 按步长

范围皆为左闭右开(起点, 终点(不包括), 步长), 大体同range()

c1 = arrange(2, 3, 0.1)
c2 = arrange(8) # 类似range(8)

1.3.2 按点数

c3 = linspace(1, 4, 10) # 线性空间
c4 = logspace(2, 5, 8) # 对数空间

II 数组运算

2.1 四则运算和叉乘

直接使用“+-*/”为按元素运算, 使用“@”进行叉乘运算
也可使用np.dot(A,B)计算点乘, np.vdot()使用向量方式处理复数

2.2 转置

任意维数组后添加.T实现转置:

A.T

对于二维数组, 转置操作和数学上的转置作用相同, 而对一维数组施加转置将没有任何效果.

Numpy中的转置可以理解为将shape属性向右循环右移一位(显然仅做此操作数组元素的整体位置不会发生变化, 此处为方便理解), 二位数组的shape属性有两个值, 因此转置操作可体现为行列互换; 而一维数组shape属性仅有一个值, 因此对其不产生影响. 此机理是为协调对高维数组仍可进行转置操作.

2.3 其他数学运算

求矩阵的迹:

A.trace()

求矩阵的行列式:

np.linalg.det(A)

计算矩阵的特征值和特征相量:

np.linalg.eig(A)

矩阵求逆:

np.linalg.inv(A)

取共轭矩阵

A.conj()

矩阵循环移位:

np.roll(A,2) # 矩阵A向右移动两位

III 数组索引

NumPy中数组的索引形式和Python一致

A.shape=(2, 2, 5) # 重新赋值shape属性 元素个数应相同
A.reshape(2, 10) # 返回一个改变了维度/形状的矩阵
A.flatten() # 返回一个展平矩阵后的数组

IV 数组的属性

返回数组的存储情况:

A.flags

返回数组的行列数:

A.shape # 返回结果为一tuple

返回矩阵维数:

A.ndim

返回矩阵中元素数量:

A.size

返回矩阵所占内存:

A.itemsize

返回矩阵类型:

A.dtype

V 数组拓展

5.1 append

ab矩阵都被展平后连接(得到一个1维数组):

c1 = np.append(a,b)

保持形状连接:

c2 = np.append(a,b,axis=0) # 纵向连接
c3 = np.append(a,b,axis=1) # 横向连接

5.2 stack

stack方法皆需要元组参数
直接拼接:
该方法需要两个shape相同的数组, 拼接得到一个更高维数组

d1 = np.stack((a,b))

[in]
a=[1 2]
b=[3 4]
[out]
d1=[[1 2] [3 4]]

纵向连接:

d2 = np.vstack((a,b)) # 类似np.append(a,b,axis=0)

横向连接:

d3 = np.hstack((a,b)) # 类似np.append(a,b,axis=1)

交错连接:

d4 = np.dstack((a,b))

[in]
a=[1 2 3 4]
b=[5 6 7 8]
[out]
d4 = 
[[1 2]
 [3 4]
 [5 6]
 [7 8]]

VI 格式转换

数据, 矩阵, 列表这三种数据类型可相互转换
转换为数组:

np.array(A)

转换为矩阵:

np.mat(B)

转换为列表:

array1.tolist()
matrix1.tolist()

分解至列表:
使用此方法数据/矩阵将分解为数个小数组/矩阵存储至列表

list(C)

A 数组和矩阵的区别

numpy array(ndarrys)可以为任意维, numpy matrices必须是2维. Matrix是Array的分支, 因此包含其全部特性.

1
2
a = np.mat([[4,3],[2,1]]) # 创建Matrix
b = np.array([[8,7],[6,5]]) # 创建Array

两者都能通过.T取得转置, 而Matrix可以通过.I得到逆矩阵, 此外Matrix使用”*”表示叉乘(显然此特性可能让程序混乱).
两者相互转换:

1
2
B = np.asmatrix(A)
A = np.asarray(B)

B 数组和列表的区别

1.创建方式不同
list(列表)是python的基本数据类型,直接使用[]即可创建
ndarray(数组)是NumPy库中的函数,只能存储单一数据类型,创建时需要引入NumPy库

1
2
3
import numpy as np
a = [123, 'abc']
b = np.array([1,2,3,4])

2.存储对象不同
列表可以存储任何对象,数组只能存储单一数据类型
3.运算方式不同
数据可以按对应元素进行四则运算,列表只能进行拼接操作
4.存储效率不同
array为了精确便捷处理庞大数据产生,其数据处理效率远大于list

参考文献
Python数组与列表的区别
python矩阵变数组 python 矩阵数组

评论