例10-1:创建数组并查看数组属性。
import numpy as np # 导入Numpy库
arr1 = np.array([1, 2, 3, 4]) # 创建的一维数组,参数为列表
print('数组的尺寸:',np.shape(arr1)) # (4, ) , 一个元素的元组,表示是一维数组
arr2 = np.array([[1,2,3,4],[4,5,6,7], [7,8,9,10]]) # 创建二维数组
print('数组的尺寸:',np.shape(arr2)) # 2个元素的元组: (3, 4)
arr2.shape[0] # 返回二维数组的行数:3
arr2.shape[1] # 返回二维数组的列数:4
其中 (4,) 代表一维数组,元素有四个;(3, 4) 代表二维数组,三行四列。
例10-2 绘制:随机生成10000数据,服从均值为0、方差为1的正态分布的直方图(间隔个数:50)。
import numpy as np
import matplotlib.pyplot as plt # 引入matplotlib 下的子库pyplot,用于绘图
np.random.seed(0)
data = np.random.normal(0,1,10000) # 生成10000个,均值为0,方差为1的高斯分布数据
print(min(data),max(data)) # 最小数、最大数
n, bins, patches = plt.hist(data,50,facecolor='green',edgecolor='white') # 直方图函数
plt.grid(True) # 设置显示网格
plt.show() # 显示绘图
例10-4 数组、矩阵之间的线性代数运算。
import numpy as np
x = np.array([[1,2,3],[0,1,-1],[1,0,0]]) # x 为二维数组:形状为 (3,3)
print(np.linalg.det(x)) # x 对应矩阵的行列式,输出:-5
y = np.linalg.inv(x) # x 对应矩阵的逆(AB=BA=E),此时的 y 为二维数组:形状为 (3,3)
a = np.dot(x,y) # 数组 x 与 y 做点积运算,等价于两个矩阵相乘
b = np.mat(x)*np.mat(y) # 将数组 x 与 y 转为矩阵,再做矩阵乘法,等价于 np.dot(x,y)
c = x * y # 数组x与y相乘,即两个数组对应元素相乘,注意:不同于np.dot(x,y)
print(a==b) # 完全相同,全为True
d = np.linalg.eigvals(x) # x 对应矩阵的特征值,返回的 d 为列表
print(d) # [-1.51154714+0.j 1.75577357+0.47447678j 1.75577357-0.47447678j ]
e = np.linalg.eig(x) # x 对应矩阵的特征值及特征向量,返回的 e 为元组
print(e[0],e[1]) # e[0]为 x 的特征值,e[1]为 x 的特征向量
例10-5文件“历年总人口.xls”、“历年新生人口和死亡人口.xls”,收录了我国部分地区1949年至2019年,历年的总人口、出生人口及死亡人口。编写程序,将这3个列数据,及对应的年份读取出来,保存在文件“历年总人口、新生人口和死亡人口.csv”中。
历年总人口.xls
历年新生人口和死亡人口.xls
import numpy as np
import xlrd
wb = xlrd.open_workbook(r"C:\pythonFiles\pythonProject\教材各章数据\教材各章数据\第10章数据\历年总人口.xls")
sheet = wb.sheet_by_index(0) # 通过索引号0获取整个sheet数据
col_0 = sheet.col_values(0) # 第0列数据,返回一个列表:年度
col_1 = sheet.col_values(1) # 第1列数据,返回一个列表:总人口
year = col_0[1:] # 年份:从第1个元素开始,到最后一个元素
total= col_1[1:] # 总人口:从第1个元素开始,到最后一个元素
year = [int(c) for c in year] # 用列表推导式,把每个元素转为整数
total = [int(c) for c in total] # 用列表推导式,把每个元素转为整数
wb = xlrd.open_workbook(r"C:\pythonFiles\pythonProject\教材各章数据\教材各章数据\第10章数据\历年新生人口和死亡人口.xls")
sheet = wb.sheet_by_index(0) # 通过索引号0获取整个sheet数据
col_1 = sheet.col_values(1) # 通过列索引号1获取列内容:出生人口
col_2 = sheet.col_values(2) # 通过列索引号2获取列内容:死亡人口
add = col_1[1:] # 出生人口:从第1个元素开始,到最后一个元素
die = col_2[1:] # 死亡人口:从第1个元素开始,到最后一个元素
add = [int(c[0:-1]) for c in add] # 用列表推导式,把最后一个‘万’字去掉
die = [int(c[0:-1]) for c in die] # 用列表推导式,把最后一个‘万’字去掉
y = np.array(add)-np.array(die) # 将两个列表变成数组相减,生成每年净增人口
m = len(year)
arr = np.array(year).reshape(m,1) # 将年份的列表转为数组,形状调整为:(m,1)
arr = np.insert(arr,1,values=total,axis=1) # 在第1列后面插入1列
arr = np.insert(arr,2,values=add,axis=1) # 在第2列后面插入1列
arr = np.insert(arr,3,values=die,axis=1) # 在第3列后面插入1列
arr = np.insert(arr,4,values=y,axis=1) # 在第4列后面插入1列
file='大陆历年总人口、新生人口和死亡人口.csv'
np.savetxt(file,arr,fmt='%i',delimiter=',',comments='',header='年份,总人口,出生人口,死亡人口,净增人口')
x = np.loadtxt(file,dtype=np.int,delimiter=',',skiprows=1)
print(x)
例10-6 读《testSet.txt》文件。testSet.txt 是机器学习中的一个经典数据集,共100行、3列,里面包含了对二维随机变量(x,y)的100次观察数据,这些样本数据被分成了两类:0或1。
import numpy as np
f = np.loadtxt(r'C:\pythonFiles\pythonProject\教材各章数据\教材各章数据\第10章数据\testSet.txt') # 打开文本文件
print('返回的二维数组f的形状:',np.shape(f))
print(f)