list 相当于 特殊的数组
数组和列表的区别:
- 数组: 存储的时同一种数据类型;
- list: 容器, 可以存储任意数据类型;
numpy
- 什么numpy?
- 快速, 方便的科学计算基础库(主要是数值的计算, 多维数组的运算);
- numpy的数据类型
- 轴的理解(axis): 0轴, 1轴, 2轴
- 一维数组: [1,2,3,45] ----0轴
- 二维数组: [[1,2,3,45], [1,2,3,45]] ----0轴, 1轴
1. numpy操作
-
numpy创建数组(矩阵)?
a = np.array([1,2,3,4,5])
c1 = np.array(range(1,6))
c2 = np.arange(1,6)创建三行四列的二维数组
b=np.arange(12).reshape(3,4]
print(type(c1))
查看数据元素的类型
print(c1.dtype)
修改数组的数据类型
print(c1.astype(‘float’))
print(c1.astype(‘bool’))
print(c1.astype(’?’)) # ?是bool类型的代号;创建的时候指定数据类型
print(np.array([1,2,3,4], dtype=np.float))
两个数组元素像加
print(a+b) #[ 2 4 6 8 10]
创建一个全为0的数组;
print(np.zeros((3, 3), dtype=np.int))
创建一个全为1的数组;
print(np.ones((3, 4)))
创建一个对角线全为1的正方形数组(方阵)
print(np.eye(3))
-
numpy数组的转置
1).
print(data.transpose())
2). 0轴 , 1 轴
print(data.swapaxes(1, 0))
3).
print(data.T) -
numpy的索引和切片
-
数组的切片是原始数组的视图,这意味着数据不会被复制,视图上的任何修改都会直接反映到源数组上
取第一行的数据print(data[0])
取第一列的数据
print(data.T[0])
print(data[:, 1])获取多行
print(data[:2])
获取多列
print(data.T[:2])
print(data[:, :2])获取指定行的前几列;
print(data[[0,2], :2])
获取指定列的前几行
print(data[:2, [0,2]])
-
花式索引
花式索引将数据复制到新数组中
-
numpy中数值的修改
布尔索引: 复杂的条件: data中所有大于8的数字都替换为0;data = np.arange(12).reshape((3, 4))
print(data>8)# 返回一个三行四列的数组, 存储的是Bool值
data[data>8] = 0复杂的条件: data中所有大于8的数字都替换为0, 否则替换为1
print(np.where(data <= 8, 1, 0))
-
数组的拼接
竖直拼接(vertically)print(np.vstack((t1, t2, t3)))
水平拼接(horizontally)
print(np.hstack((t1, t2, t3)))
-
数组的行列交换
行交换(第一行和第二行进行交换)t4[[0, 1], :] = t4[[1, 0], :]
列交换(第3列和第5列进行交换)
t4[:, [2, 4]] = t4[:, [4, 2]]
-
numpy常用的方法
获取数组里面最大值的索引;max_item1 = np.argmax(data)
print(max_item1)获取每一列的最大值对应的索引;
print(np.argmax(data, axis=0))
获取每一行的最大值对应的索引;
print(np.argmax(data, axis=1))
-
numpy的深拷贝和浅拷贝
列表的深拷贝和浅拷贝- 浅拷贝: a= b[::] a = copy.copy(b)
- 深拷贝: a = copy.deepcopy(b)
numpy中的拷贝
- data1 = data: 完全不复制, 两个变量相互影响, 指向同一块内存空间;
- data2 = data[::], 会创建新的对象data2,
但是两个的数据变化是一致的;其中一个变了,另一个也会变 - data3 = data.copy(), 深拷贝, 两个变量不互相影响;
-
numpy中的nan和inf
nan(not a number): 表示不是一个数字, 代表的是数据缺失
inf(infinity): inf代表正无穷
-inf代表负无穷
- nan的特殊属性:
-
两个nan的值是不相等的, 是float类型:
*>>>np.nan == np.nan
False
*>>> np.nan != np.nan
True
*>>> type(np.nan)
<class ‘float’> -
缺失值
判断data里面的缺失值np.isnan(data)#返回值为bool的数组
data!=data#返回值为bool的数组判断有多少个缺失值
np.count_nonzero(data!=data)
np.count_nonzero(np.isnan(data))
np.isnan(data).sum()判断缺失值的位置
np.where(np.isnan(data))
-
- numpy的常用统计函数
-
求和
print(data.sum())
每一列数据的和;
print(data.sum(axis=0))
每一行数据的和;
print(data.sum(axis=1))
-
均值
print(data.mean())
print(data.mean(axis=0))
print(data.mean(axis=1)) -
中值
print(np.median(data))
print(np.median(data, axis=0))
print(np.median(data, axis=1)) -
最大值
print(data.max())
print(data.max(axis=0))
print(data.max(axis=1)) -
最小值
-
极差
print(np.ptp(data))
print(np.ptp(data, axis=0))
print(np.ptp(data, axis=1)) -
标准差: 代表的是数据的波动稳定情况, 数字越大, 越不稳定;
print(data.std())
print(data.std(axis=0))
print(data.std(axis=1))
- 两个小例子
1.学生身高体重统计分析案例
需求1:
获取所有男生的身高平均值;获取所有女生的身高平均值;并绘制柱状图显示
import numpy as np
from pyecharts import Bar
fname = "eg6-a-student-data.txt"
dtype = np.dtype([('gender', '|S1'), ('height', 'f2')])
#---------------------------------------知识点-------------------------------------------
# fname: 文件的名称, 可以是文件名, 也可以是ugz或者bz2的压缩文件;
# dtype: 数据类型, 可选, 默认是float;
# delimiter: 分隔符字符串, 默认情况是任何的空格,
# skiprows: 跳过前xx行, 一般情况跳过第一行;
# usecols: 读取指定的列, 可以是元组;
# unpack: 如果为True, 对返回的数组对象转置;
data = np.loadtxt(fname=fname, dtype=dtype, skiprows=9,usecols=(1, 3))
# 判断是否性别为男的表达式
isMale = data['gender'] == b'M'
male_avg_height = data['height'][isMale].mean()
female_avg_height = data['height'][~isMale].mean()
bar = Bar(title="不同性别身高的平均值")
bar.add("", ["男", '女'], [male_avg_height, female_avg_height])
bar.render()
eg6-a-student-data.txt文件中的内容
需求2:
获取所有男生的体重, 求平均值;获取所有女生的体重, 求平均值;并绘制柱状图显示
def parser_weight(weight):
# 对于体重数据的处理, 如果不能转换为浮点数据类型, 则返回缺失值;
try:
return float(weight)
except ValueError as e:
return -99
fname = "eg6-a-student-data.txt"
dtype = np.dtype([('gender', '|S1'), ('height', 'f2'), ('weight', 'f2')])
data = np.loadtxt(fname=fname, dtype=dtype, skiprows=9,
usecols=(1, 4), converters={4:parser_weight})
# 判断是否性别为男
isMale = data['gender'] == b'M'
male_avg_height = data['height'][isMale].mean()
female_avg_height = data['height'][~isMale].mean()
# 判断体重是否大于0
is_weight_vaild = data['weight'] > 0
male_avg_weight = data['weight'][isMale & is_weight_vaild].mean()
female_avg_weight = data['weight'][~isMale & is_weight_vaild].mean()
bar = Bar(title="不同性别体重身高的平均值")
bar.add("身高", ["男", '女'], [male_avg_height, female_avg_height])
bar.add("体重", ["男", '女'], [male_avg_weight, female_avg_weight])
bar.render()
nunpy的小练习
题目:
1. 创建一个 5x5 的二维数组,其中边界值为1,其余值为0;
- np.ones()
- 切片和索引的赋值
2. 使用数字 0 将一个全为 1 的 5x5 二维数组包围, 效果如下:
array([[0., 0., 0., 0., 0., 0., 0.],
[0., 1., 1., 1., 1., 1., 0.],
[0., 1., 1., 1., 1., 1., 0.],
[0., 1., 1., 1., 1., 1., 0.],
[0., 1., 1., 1., 1., 1., 0.],
[0., 1., 1., 1., 1., 1., 0.],
[0., 0., 0., 0., 0., 0., 0.]])
3. 创建一个 10x10 的二维数组,并使得 1 和 0 沿对角线间隔放置, 效果如下:
array([[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
[1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
[1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
[1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
[1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
[1, 0, 1, 0, 1, 0, 1, 0, 1, 0]])
4. 创建一个 0-10 的一维数组,并将 (1, 9] 之间的数全部反转成负数, 效果如下:
array([ 0, 1, -2, -3, -4, -5, -6, -7, -8, -9, 10])
5. 创建一个 5x5 的矩阵,其中每行的数值范围从 1 到 5, 效果如下:
array([[1., 2., 3., 4., 5.],
[1., 2., 3., 4., 5.],
[1., 2., 3., 4., 5.],
[1., 2., 3., 4., 5.],
[1., 2., 3., 4., 5.]])
6. 创建一个长度为 5 的一维数组,并将其中最大值替换成 0
7. 将二维数组的前两行进行顺序交换, 效果如下:
- 交换前
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]
[20 21 22 23 24]]
- 交换后
[[ 5 6 7 8 9]
[ 0 1 2 3 4]
[10 11 12 13 14]
[15 16 17 18 19]
[20 21 22 23 24]]
8. 找出给定一维数组中非 0 元素的位置索引
9.找出数组中缺失值的总数及所在位置, 案例如下:
array([[0.8 , 0.25, 0.74, 0.05, 0.24, 0.16, 0.63, 0.62, 0.89, 0.85],
[0.61, 0.76, 0.26, 0.3 , 0.82, 0.74, 0.96, 0.64, 0.58, 0.06],
[0.78, 0.38, 0.19, 0.68, 0.75, 0.91, 0.13, 0.24, 0.98, 0.21],
[0.47, 0.12, 0.34, 0.06, 0.46, 0.69, 0.1 , nan, 0.27, 0.92],
[0.83, 0.01, 0.63, 0.15, 0.52, 0.52, 0.02, 0. , 0.74, 0.59],
[0.56, 0.66, 0.15, nan, 0.26, 0.88, 0.15, 0.57, 0.61, 0.35],
[0.33, 0.58, 0.06, 0.94, 0.58, 0.53, 0.97, 0.02, 0.32, nan],
[0.84, 0.71, 0.65, 0.42, 0.44, 0.96, 0.37, 0.65, 0.6 , 0.17],
[0.04, 0.94, 0.92, nan, 0.7 , 0.38, 0.28, 0.45, 0.35, 0.93],
[0.38, 0.69, 0.43, 0.01, 0.67, 0.46, 0.73, 0.99, 0.94, 0.45]])
缺失值总数:
4
缺失值索引:
(array([3, 5, 6, 8]), array([7, 3, 9, 3]))
答案:
import random
import numpy as np
from numpy import nan
# # #1.
# data=np.ones((5,5))
# data[1:4,1:4]=0
# print(data)
#
# # 2.
# data=np.ones((5,5))
# data[[0,4],:]=0
# data[:,[0,4]]=0
# print(data)
#3.
data=np.ones((10,10))
data[:,1::2]=0
data[0::2,:]=data[9::-2,::-1]
print(data)
# #4.
# data=np.arange(10)
# data[1:]=0-data[1:]
# print(data)
# #5.
# data=np.array([1,2,3,4,5]*5).reshape(5,5)
# print(data)
# # 6
# data=np.array([random.randint(1,101) for i in range(5)])
# data[np.argmax(data)]=0
# print(data)
#
print('------------7-------------')
data=np.arange(25).reshape(5,5)
print(data)
data[[0,1],:]=data[[1,0],:]
print(data)
#
# print('-----------------8------------------')
# data=np.array([1,4,0,5,0,4])
# # print([i for i in range(len(data)) if data[i]!=0 ])
# print(np.where(data[:]!=0))
#
print('-------9---------------------')
data=np.array([[0.8 , 0.25, 0.74, 0.05, 0.24, 0.16, 0.63, 0.62, 0.89, 0.85],
[0.61, 0.76, 0.26, 0.3 , 0.82, 0.74, 0.96, 0.64, 0.58, 0.06],
[0.78, 0.38, 0.19, 0.68, 0.75, 0.91, 0.13, 0.24, 0.98, 0.21],
[0.47, 0.12, 0.34, 0.06, 0.46, 0.69, 0.1 , nan, 0.27, 0.92],
[0.83, 0.01, 0.63, 0.15, 0.52, 0.52, 0.02, 0. , 0.74, 0.59],
[0.56, 0.66, 0.15, nan, 0.26, 0.88, 0.15, 0.57, 0.61, 0.35],
[0.33, 0.58, 0.06, 0.94, 0.58, 0.53, 0.97, 0.02, 0.32, nan],
[0.84, 0.71, 0.65, 0.42, 0.44, 0.96, 0.37, 0.65, 0.6 , 0.17],
[0.04, 0.94, 0.92, nan, 0.7 , 0.38, 0.28, 0.45, 0.35, 0.93],
[0.38, 0.69, 0.43, 0.01, 0.67, 0.46, 0.73, 0.99, 0.94, 0.45]])
print('缺失值总数',np.count_nonzero(data!=data))
print('缺失值总数',np.count_nonzero(np.isnan(data)))
print('缺失值总数',np.isnan(data).sum())
print(np.where(np.isnan(data)))