? numpy是Python的一种开源的数值计算扩展库。这种库可用来存储和处理大型numpy数组,比Python自身的嵌套列表结构要高效的多(该结构也可以用来表示numpy数组)。
? numpy库有两个作用:
import numpy as np
print(np.array([1,2,3]))
print(np.array([[1,2,3],[4,5,6]]))
[1 2 3]
[[1 2 3]
[4 5 6]]
? 数组的转置
print(arr.T)
[[1. 4.]
[2. 5.]
[3. 6.]]
? 数组元素的数据类型
print(arr.dtype)
float32
? 数组元素的个数
print(arr.size)
6
? 数组的维度数
print(arr.ndim)
2
? 数组维度的大小(组元)
print(arr.shape)
(2,3)
? 获取numpy数组的行
print(arr.shape[0]
2
? 获取numpy数组的列
print(arr.shape[1])
3
? 取出所有元素
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(arr[:, :])
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
? 取第一行的所有元素
print(arr[:1, :])
[[1 2 3 4]]
? 取第一列的所有元素
print(arr[:, :1])
[[1]
[5]
[9]]
? 取第一行第一列的元素
print(arr[0, 0])
1
? 取大于5的元素,返回一个数组
print(arr[arr > 5])
[ 6 7 8 9 10 11 12]
? 取第一行的所有元素,并且让第一行的元素都为0
arr1 = arr.copy()
arr1[:1, :] = 0
print(arr1)
[[ 0 0 0 0]
[ 5 6 7 8]
[ 9 10 11 12]]
? 取所有大于5的元素,并且让大于5的元素为0
arr2 = arr.copy()
arr2[arr > 5] = 0
print(arr2)
[[1 2 3 4]
[5 0 0 0]
[0 0 0 0]]
? 对numpy数组清零
arr3 = arr.copy()
arr3[:, :] = 0
print(arr3)
? 合并两个numpy数组的行,注意使用hstack()方法合并numpy数组,numpy数组应该有相同的行,其中hstack的h表示horizontal水平的
arr1 = np.array([[1, 2], [3, 4], [5, 6]])
arr2 = np.array([[7, 8], [9, 10], [11, 12]])
print(np.hstack((arr1, arr2)))
print(np.concatenate((arr1, arr2), axis=1))
[[ 1 2 7 8]
[ 3 4 9 10]
[ 5 6 11 12]]
? 合并两个numpy数组的列,注意使用vstack()方法合并numpy数组,numpy数组应该有相同的列,其中vstack的v表示vertical垂直的
arr1 = np.array([[1, 2], [3, 4], [5, 6]])
arr2 = np.array([[7, 8], [9, 10], [11, 12]])
print(np.vstack((arr1, arr2)))
print(np.concatenate((arr1, arr2), axis=0))
[[ 1 2]
[ 3 4]
[ 5 6]
[ 7 8]
[ 9 10]
[11 12]]
方法 | 详解 |
---|---|
array() | 将列表转换为数组,可选择显式指定dtype |
arange() | range的numpy版,支持浮点数 |
linspace() | 类似arange(),第三个参数为数组长度 |
zeros() | 根据指定形状和dtype创建全0数组 |
ones() | 根据指定形状和dtype创建全1数组 |
eye() | 创建单位矩阵 |
empty() | 创建一个元素全随机的数组 |
reshape() | 重塑形状 |
运算符 | 说明 |
---|---|
+ | 两个numpy数组对应元素相加 |
- | 两个numpy数组对应元素相减 |
* | 两个numpy数组对应元素相乘 |
/ | 两个numpy数组对应元素相除,如果都是整数则取商 |
% | 两个numpy数组对应元素相除后取余数 |
**n | 单个numpy数组每个元素都取n次方,如**2:每个元素都取平方 |
np.sin(arr) | 对numpy数组arr中每个元素取正弦,sin(x)sin(x) |
---|---|
np.cos(arr) | 对numpy数组arr中每个元素取余弦,cos(x)cos(x) |
np.tan(arr) | 对numpy数组arr中每个元素取正切,tan(x)tan(x) |
np.arcsin(arr) | 对numpy数组arr中每个元素取反正弦,arcsin(x)arcsin(x) |
np.arccos(arr) | 对numpy数组arr中每个元素取反余弦,arccos(x)arccos(x) |
np.arctan(arr) | 对numpy数组arr中每个元素取反正切,arctan(x)arctan(x) |
np.exp(arr) | 对numpy数组arr中每个元素取指数函数,exex |
np.sqrt(arr) | 对numpy数组arr中每个元素开根号x??√ |
? 数组的逆
arr = np.array([[1, 2, 3], [4, 5, 6], [9, 8, 9]])
print(np.linalg.inv(arr))
[[ 0.5 -1. 0.5 ]
[-3. 3. -1. ]
[ 2.16666667 -1.66666667 0.5 ]]
? 数组数学和统计方法
方法 | 详解 |
---|---|
sum | 求和 |
cumsum | 累加求和 |
mean | 求平均数 |
std | 求标准差 |
var | 求方差 |
min | 求最小值 |
max | 求最大值 |
argmin | 求最小值索引 |
argmax | 求最大值索引 |
sort | 排序 |
? 生成随机数
函数名称 | 函数功能 | 参数说明 |
---|---|---|
rand(d0,d1,?,dnd0,d1,?,dn) | 产生均匀分布的随机数 | dndn为第n维数据的维度 |
randn(d0,d1,?,dnd0,d1,?,dn) | 产生标准正态分布随机数 | dndn为第n维数据的维度 |
randint(low[, high, size, dtype]) | 产生随机整数 | low:最小值;high:最大值;size:数据个数 |
random_sample([size]) | 在[0,1)[0,1)内产生随机数 | size为随机数的shape,可以为元祖或者列表 |
choice(a[, size]) | 从arr中随机选择指定数据 | arr为1维数组;size为数组形状 |
uniform(low,high [,size]) | 给定形状产生随机数组 | low为最小值;high为最大值,size为数组形状 |
shuffle(a) | 与random.shuffle相同 | a为指定数组 |
? pandas基于Numpy,可以看成是处理文本或者表格数据。pandas中有两个主要的数据结构,其中Series数据结构类似于Numpy中的一维数组,DataFrame类似于多维表格数据结构。
pandas是python数据分析的核心模块。它主要提供了五大功能:
? Series是一种类似于一维数组的对象,由一组数据和一组与之相关的数据标签(索引)组成。
? Series比较像列表(数组)和字典的结合体。
详解 | 方法 |
---|---|
从ndarray创建Series | Series(arr) |
与标量运算 | df*2 |
两个Series运算 | df1+df2 |
索引 | df[0], df[[1,2,4]] |
切片 | df[0:2] |
通用函数 | np.abs(df) |
布尔值过滤 | df[df>0] |
? Series支持字典的特性
详解 | 方法 |
---|---|
从字典创建Series | Series(dic), |
in运算 | ’a’ in sr |
键索引 | sr[‘a‘], sr[[‘a‘, ‘b‘, ‘d‘]] |
? Series缺失数据处理
方法 | 详解 |
---|---|
dropna() | 过滤掉值为NaN的行 |
fillna() | 填充缺失数据 |
isnull() | 返回布尔数组,缺失值对应为True |
notnull() | 返回布尔数组,缺失值对应为False |
? DataFrame是一个表格型的数据结构,含有一组有序的列。
? DataFrame可以被看做是由Series组成的字典,并且共用一个索引。
属性 | 详解 |
---|---|
dtype | 查看数据类型 |
index | 查看行序列或者索引 |
columns | 查看各列的标签 |
values | 查看数据框内的数据,也即不含表头索引的数据 |
describe | 查看数据每一列的极值,均值,中位数,只可用于数值型数据 |
transpose | 转置,也可用T来操作 |
sort_index | 排序,可按行或列index排序输出 |
sort_values | 按数据值来排序 |
? 读取文件导入数据函数主要参数:
参数 | 详解 |
---|---|
sep | 指定分隔符,可用正则表达式如‘\s+‘ |
header=None | 指定文件无行名 |
name | 指定列名 |
index_col | 指定某列作为索引 |
skip_row | 指定跳过某些行 |
na_values | 指定某些字符串表示缺失值 |
parse_dates | 指定某些列是否被解析为日期,布尔值或列表 |
? 写入文件函数的主要参数:
参数 | 详解 |
---|---|
sep | 分隔符 |
na_rep | 指定缺失值转换的字符串,默认为空字符串 |
header=False | 不保存列名 |
index=False | 不保存行索引 |
cols | 指定输出的列,传入列表 |
? matplotlib是一个绘图库,它可以创建常用的统计图,包括条形图、箱型图、折线图、散点图、饼图和直方图。
一、条形图
[0, 1, 2, 3]
student_amounts = [66, 55, 45, 70]
# 画布设置
fig = plt.figure()
# 1,1,1表示一张画布切割成1行1列共一张图的第1个;2,2,1表示一张画布切割成2行2列共4张图的第一个(左上角)
ax1 = fig.add_subplot(1, 1, 1)
ax1.bar(classes_index, student_amounts, align='center', color='darkblue')
ax1.xaxis.set_ticks_position('bottom')
ax1.yaxis.set_ticks_position('left')
plt.xticks(classes_index,
classes,
rotation=0,
fontsize=13,
fontproperties=font)
plt.xlabel('班级', fontproperties=font, fontsize=15)
plt.ylabel('学生人数', fontproperties=font, fontsize=15)
plt.title('班级-学生人数', fontproperties=font, fontsize=20)
# 保存图片,bbox_inches='tight'去掉图形四周的空白
# plt.savefig('classes_students.png?x-oss-process=style/watermark', dpi=400, bbox_inches='tight')
plt.show()
二、直方图
[59.00855949 43.16272141 48.77109774 ... 57.94645859 54.70312714
58.94125528]
# 构造均值为100的符合正态分布的数据
x2 = mu2 + sigma * np.random.randn(10000)
print(x2)
[115.19915511 82.09208214 110.88092454 ... 95.0872103 104.21549068
133.36025251]
fig = plt.figure()
ax1 = fig.add_subplot(121)
# bins=50表示每个变量的值分成50份,即会有50根柱子
ax1.hist(x1, bins=50, color='darkgreen')
ax2 = fig.add_subplot(122)
ax2.hist(x2, bins=50, color='orange')
fig.suptitle('两个正态分布', fontproperties=font, fontweight='bold', fontsize=15)
ax1.set_title('绿色的正态分布', fontproperties=font)
ax2.set_title('橙色的正态分布', fontproperties=font)
plt.show()
三、折线图
[ 1.62434536 1.01258895 0.4844172 -0.58855142 0.2768562 -2.02468249
-0.27987073 -1.04107763 -0.72203853 -0.97140891 0.49069903 -1.56944168
-1.89185888 -2.27591324 -1.1421438 -2.24203506 -2.41446327 -3.29232169
-3.25010794 -2.66729273 -3.76791191 -2.6231882 -1.72159748 -1.21910314
-0.31824719 -1.00197505 -1.12486527 -2.06063471 -2.32852279 -1.79816732
-2.48982807 -2.8865816 -3.5737543 -4.41895994 -5.09020607 -5.10287067
-6.22018102 -5.98576532 -4.32596314 -3.58391898]
plot_data2 = randn(40).cumsum()
plot_data3 = randn(40).cumsum()
plot_data4 = randn(40).cumsum()
plt.plot(plot_data1, marker='o', color='red', linestyle='-', label='红实线')
plt.plot(plot_data2, marker='x', color='orange', linestyle='--', label='橙虚线')
plt.plot(plot_data3, marker='*', color='yellow', linestyle='-.', label='黄点线')
plt.plot(plot_data4, marker='s', color='green', linestyle=':', label='绿点图')
# loc='best'给label自动选择最好的位置
plt.legend(loc='best', prop=font)
plt.show()
四、散点图+直线图
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
# 拟合一条水平散点线
np.random.seed(1)
y_linear = x + 10 * np.random.randn(19)
print(y_linear)
[ 17.24345364 -4.11756414 -2.28171752 -6.72968622 13.65407629
-17.01538697 24.44811764 0.38793099 12.19039096 7.50629625
25.62107937 -8.60140709 9.77582796 10.15945645 26.33769442
5.00108733 15.27571792 9.22141582 19.42213747]
# 拟合一条x2的散点线
y_quad = x**2 + 10 * np.random.randn(19)
print(y_quad)
[ 6.82815214 -7.00619177 20.4472371 25.01590721 30.02494339
45.00855949 42.16272141 62.77109774 71.64230566 97.3211192
126.30355467 137.08339248 165.03246473 189.128273 216.54794359
249.28753869 288.87335401 312.82689651 363.34415698]
# s是散点大小
fig = plt.figure()
ax1 = fig.add_subplot(121)
plt.scatter(x, y_linear, s=30, color='r', label='蓝点')
plt.scatter(x, y_quad, s=100, color='b', label='红点')
ax2 = fig.add_subplot(122)
plt.plot(x, y_linear, color='r')
plt.plot(x, y_quad, color='b')
# 限制x轴和y轴的范围取值
plt.xlim(min(x) - 1, max(x) + 1)
plt.ylim(min(y_quad) - 10, max(y_quad) + 10)
fig.suptitle('散点图+直线图', fontproperties=font, fontsize=20)
ax1.set_title('散点图', fontproperties=font)
ax1.legend(prop=font)
ax2.set_title('直线图', fontproperties=font)
plt.show()
[]
原文:https://www.cnblogs.com/tangceng/p/11379673.html