本笔记摘录清华大学工业工程系朱成礼老师的python教案与授课内容,并在此基础上进行实操性的拓展,希望能对大家有所帮助。

 一、ndarray多维数组

1、ndarray是numpy中的多维数组

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

2、ndarray内部结构 

要求ndarray中所有元素必须是同类元素,在内存中是一块连续的存储空间(Memory Block),另一个对象存储对数据的解释(Data Structure) 。ndarray切片后产生新的data structure,memory block不变;List切片后没有视图,所以就相当于copy了一个副本,产生了一个新的List 。

3、ndarray对象的常用属性 

python中的库arrow python array库_数组

一点想法:在使用时,应注意区分是numpy后的属性函数还是ndarray后面的属性函数。若是numpy所拥有的函数应该使用numpy.+函数名;若是ndarray后面的属性函数,则应使用“数组名.+函数名”

二、ndarray的创建方法 

 1、基础功能

# 创建一ndarray
import numpy as np
a = np.array(object)  # object是生成数组的数据序列[[list1],[list2]....]
print(a.dtype)
print(a.shape)

b = np.arange([start,]stop[,step])  # arange支持小数步长
c = np.linspace(start, stop, num = 50)  # num指定等差数列的数据个数,stop的元素也包括在内

d = np.ones(shape=(5,3))  # 创建一个5*3的全是1的数组
e = np.ones_like(a)  # 创建一个和a形状一样,全是1的数组
# zero zero_like同理

eye();identity(n);full(shape,num)

2、示例

# 用array()创建ndarray数组
import numpy as np  # 导入numpy扩展库

a = np.array([[1, 2, 3], [2, 6, 4], [8, 4, 5]])
print(a)
print(a.ndim)  # 输出数组的秩
print(a.shape)  # 输出数组的形状
print(a.T)  # 输出数组的转置
print(a.dtype)  # 输出数组的数据类型
print(a.size)  # 输出数组的元素数

# 用arange()创建ndarray数组
b = np.arange(1, 7, 0.5)
print(b.dtype)  # 输出数组的数据类型
print(b.shape)  # 输出数组形状

# 用linspace输出一个有三十个元素的数组,数据类型为float
c = np.linspace(3.1, 5.7, 30)
print(c.dtype)

# 创建一个4*5 全部值都是6的数组
d = np.full(shape=(4, 5), fill_value=6)
print(d)

三、numpy数组元素操作

简要总结什么时候前缀是numpy什么时候前缀是数组名:

前缀是numpy的情况:创建一个数组、特殊元素过滤、数组的正常运算和线性代数运算\数组元素的筛选

前缀是数组名的情况:数组索引、数组切片、改变数组形状、数组的统计学运算、数组内元素的排序

1、数组索引 

首先,索引和切片不同,他总是将索引元素复制到新数组中。

索引从零开始,有以下三种索引方式

python中的库arrow python array库_python中的库arrow_02

 1.5、特殊元素过滤

# 特殊元素过滤
import numpy as np
a = np.array([[np.nan,1,2],[np.nan,3,4]])
b = np.array([1,2+6j,5,3.5+5j])
print(a)
print(b)

# 使用了~()取补运算符来过滤NaN
print(a[~np.isnan(a)])

# 从数组中过滤掉非复数元素
print(b[np.iscomplex(b)])

2、数组切片

示例:

# 用linspace函数,在啊【0,20)生成30个等差一维数组,
# 并将数组形状变换为10行,3列的二维数组arr_1
import numpy as np

a = np.linspace(0, 20, 30)
arr_1 = a.reshape(10, 3)
print(arr_1)

# 获取由arr_1第五行到第七行,第一列到第三列的元素构成的3*3二维数组切片
arr_2 = arr_1[4:7, 0:3]
print(arr_2)

# 获取由arr_1偶数行、第1到2列元素构成的一个二维数组切片:arr_3
arr_3 = arr_1[0::2, 0:2]
print(arr_3)

# 获取arr_1中大于10的元素构成的数组:arr_4
arr_4 = arr_1[arr_1 > 10]
print(arr_4)

# 获取arr_1由列表[3,6,9]索引获得的行,第2到3列组成的数组:arr_5
m = [3,6,9]
arr_5 = arr_1[m, 1:3]
print(arr_5)


 一定要注意区分切片与索引二者的区别:索引是,你可以找到数中的某一行或某一列元素,并对其进行修改,修改后的结果返回一个新数组;而切片是你选择某一块元素后,若将其进行修改后输出,只输出修改的部分,数组中的其他未修改的部分不输出,在此同时,原数组没有发生改变。

ep: arr_1[:, 0]是索引找到第一列;而arr_1[, 0:]是切片切出第一列

3、改变数组形状

python中的库arrow python array库_python_03

四、数组的运算

1、数组的算术运算与运算函数

算术运算的加减乘除是对应元素之间的加减乘除。

python中的库arrow python array库_学习_04

python中的库arrow python array库_python中的库arrow_05

 

 

2、ndarray数组线性代数运算

python中的库arrow python array库_python中的库arrow_06

 

# 已知一个矩阵A,求A的逆,求A的行列式的值,再求A逆B

# 写入这个矩阵A
import numpy as np
A = np.array([[1,2,1],[2,-1,3],[3,1,2]])
print(f'矩阵A为:{A}')
inverseA = np.linalg.inv(A)  # 求A的逆
print(f'矩阵A的逆为:{inverseA}')
deterA = np.linalg.det(A)  # 求A的行列式的值
print(f'矩阵A的行列式的值为:{deterA}')

# 写入向量b
b = np.array([[7],[7],[18]])
print(f'向量b为:{b}')
sol = np.dot(inverseA,b)  # 计算A逆b
print(f'计算A的逆乘b的结果为:{sol}')

# 解方程Ax=b
x = np.linalg.solve(A,b)
print(f'Ax=b方程的解为:{x}')

3、ndarray常用统计函数

python中的库arrow python array库_学习_07

 

# 使用numpy为多维数组进行统计计算
# 创建ndarray数组
import numpy as np
array_a = np.array([[8, 3, 2, 5], [6, 22, 15, 8], [36, 16, 20, 31]])
print(array_a)

# 计算每列的最大值和均值
line_max = array_a.max(axis=0)
print(f'每列的最大值为:{line_max}')
mean = array_a.mean(axis=0)
print(f'每列的均值为:{mean}')

# 按第二列的数值大小,对行进行排序
sorted_idx = array_a[:, 1].argsort()
result = array_a[sorted_idx]
print(f'按第二列的数值大小进行排序为:{result}')

# 筛选出大于20的元素
x = np.where(array_a > 20)
print(f'数组中大于20的元素为:{array_a[x]}')

4、ndarray元素的排序和筛选

 4.1 ndarray.sort()与ndarray.argsort()函数排序对比

相同点:括号内都是这样的格式(axis= ,kind='quicksort', order=None)# order:如果数组包含字段,则这里是要排序的字段

axis = 0  # 按列排序;axis = 1  # 按行排序;axis = -1  # 默认沿着最里层排序

不同点:sort()排序是原地对数组进行排序,排序后改变了原数组,没有返回值;而argsort()排序是返回对数组进行排序后元素在原数组中的索引,也就是说,需要

sorted_idx = x[:,2].argsort()

y = x[sorted_idx]

print(y)才能得到排序后的整个数组的结果(注意这里[:,2]用的是索引哦~)

4.2  numpy.where()筛选函数

python中的库arrow python array库_python_08

 where函数也相当于生成了一个索引。

五、随机数生成方法(使用numpy.random模块)

ps:随手记录一下   ./当前路径

../表示当前路径的父目录

1、简单随机数

1.1 简单随机数的生成方法

import numpy as np
a = np.random.rand(d0,d1,...dn)  # 生成一个随机数组,元素取自[0,1)上的均匀分布

b = np.random.randn(d1,d2,d3,...dn)  # 生成一个数组,元素是标准正态分布随机数,若没有参数,则返回单个数据

c = np.random.randint(m,n,size)  # 生成m,n范围的数组,形状为size(传入元组形式的shape)ep:传入一个(1,2)

1.2 随机抽取元素

python中的库arrow python array库_学习_09

 

2、随机分布

python中的库arrow python array库_数据类型_10

3、随机排列

python中的库arrow python array库_数组_11

六、读写文件

python中的库arrow python array库_数组_12

python中的库arrow python array库_数据类型_13

 

python中的库arrow python array库_数组_14

 

python中的库arrow python array库_数据类型_15

 

 numpy的使用过程相对枯燥,但他却是许多其他的库使用的基石,因此学好numpy库也是十分必要的!