数组的操作
list ====== 特殊的数组 数组和列表的区别:
- 数组: 存储的时同一种数据类型;
- list:容器, 可以存储任意数据类型;
# 一维数组和数组的计算
a = [1, 2, 3, 4]
b = [2, 3, 4, 5]
add = lambda x: x[0] + x[1]
# [(1,2), (2,3), (3,4), (4,5)]
print([add(item) for item in zip(a, b)])
mul = lambda x: x[0] * x[1]
# [(1,2), (2,3), (3,4), (4,5)]
print([mul(item) for item in zip(a, b)])
# 二维数组和数组的计算
c = [[1, 2, 3, 4],
[1, 2, 3, 4]]
d = [[2, 3, 4, 5],
[2, 3, 4, 5]]
#
# print(c*d)
# print(c+d)
Numpy:
- 什么numpy?
- numpy基础概念
- numpy常用的方法
- numpy常用的统计方法
-
什么numpy?
快速, 方便的科学计算基础库(主要时数值的计算, 多维数组的运算); -
numpy的数据类型
-
轴的理解(axis): 0轴, 1轴, 2轴
- 一维数组: [1,2,3,45] ----0轴
- 二维数组: [[1,2,3,45], [1,2,3,45]] ----0轴, 1轴,
import numpy as np
#1. numpy中如何创建数组(矩阵)?
#方法1:
a = np.array([1,2,3,4,5])
b = np.array([1,2,3,4,5])
c1 = np.array(range(1,6))
print(a+b)
#方法2:
c2 = np.arange(1,6)
print(c1)
print(c2)
#数组的类名: numpy.ndarray
print(type(c1))
#查看数据元素的类型
print(c1.dtype)
#2. 修改数组的数据类型
print(c1.astype(‘float’))
print(c1.astype(‘bool’))
print(c1.astype(’?’)) # ?是bool类型的代号;
#创建的时候指定数据类型
print(np.array([1,2,3,4], dtype=np.float))
#3. 修改浮点数的小数位数
c3 = np.array([1.234556, 3.45464456, 5.645657567])
print(np.round(c3, 2))
numpy读取数据
CSV(逗号分隔符文件),广义的csv文件可以不是逗号分隔;
显示: 以Excel表格的方式打开;
import numpy as np
fname = "doc/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), unpack=True)
print(data)
numpy数据的转置
import numpy as np
# 将一维数组转换为3行4列的二维数组
data = np.arange(12).reshape((3, 4))
print(data)
# 1).
print(data.transpose())
# 2). 0轴 , 1 轴
print(data.swapaxes(1, 0))
# 3).
print(data.T)
数据的索引和切片
import numpy as np
# 将一维数组转换为3行4列的二维数组
data = np.arange(12).reshape((3, 4))
print(data)
# 取第一行的数据
print(data[0])
# 取第一列的数据
print(data.T[0])
print(data[:, 1])
# 获取多行
print(data[:2])
# 获取多行列
print(data.T[:2])
print(data[:, :2])
# 获取指定行的前几列;
print(data)
print(data[[0,2], :2])
print(data[:2, [0,2]])
numpy中数值的修改
import numpy as np
# 将一维数组转换为3行4列的二维数组
data = np.arange(12).reshape((3, 4))
print(data)
# # 取第一行的数据
# data[0] = 0
# print(data)
#
# # 获取多行列
# data.T[:2] = 0
# print(data)
# # 布尔索引: 复杂的条件: data中所有大于8的数字都替换为0;
# # 返回一个三行四列的数组, 存储的是Bool值
# print(data>8)
# data[data>8] = 0
# print(data)
# 复杂的条件: data中所有大于8的数字都替换为0, 否则替换为1; a>b?a:b
# print(data)
# data[data<=8] = 1
# data[data>8] = 0
# print(data)
print(np.where(data <= 8, 1, 0))
# 裁剪: 如果data<=8, 替换称8, 如果data>=10, 替换为10;
print(data)
print(data.clip(8, 10))
# ************************************************
# 数组的拼接
t1 = np.arange(12).reshape(2, 6)
t2 = np.arange(12).reshape(2, 6)
t3 = np.arange(12).reshape(2, 6)
# 竖直拼接(vertically)
print(np.vstack((t1, t2, t3)))
# 水平拼接(horizontally)
print(np.hstack((t1, t2, t3)))
# *************************************************
# 数组的行列交换
t4 = np.arange(12).reshape(2, 6)
# 行交换(第一行和第二行进行交换)
print("原数据:\n", t4)
t4[[0, 1], :] = t4[[1, 0], :]
print("替换后的数据:\n", t4)
# 列交换(第3列和第5列进行交换)
print("原数据:\n", t4)
t4[:, [2, 4]] = t4[:, [4, 2]]
print("替换后的数据:\n", t4)
numpy常用的方法
import numpy as np
# 将一维数组转换为3行4列的二维数组
data = np.arange(12).reshape((3, 4))
data[0, 0] = 80
print(data)
# 1. 获取最大值和最小值的位置;
# 获取当前数组里面最大值的索引;
max_item1 = np.argmax(data)
print(max_item1) #索引值
# 获取每一列的最大值对应的索引;
print(np.argmax(data, axis=0))
# 获取每一行的最大值对应的索引;
print(np.argmax(data, axis=1))
# 2. 创建一个全为0的数组;
print(np.zeros((3, 3), dtype=np.int))
# 3. 创建一个全为1的数组;
print(np.ones((3, 4)))
# 4. 创建一个对角线全为1的正方形数组(方阵)
print(np.eye(3))
numpy的深拷贝和浅拷贝
列表的深拷贝和浅拷贝
浅拷贝: a= b[::] a = copy.copy(b)
深拷贝: a = copy.deepcopy(b)
numpy中的拷贝
- data1 = data: 完全不复制, 两个变量相互影响, 指向同一块内存空间;
- data2 = data[::], 会创建新的对象data2,
但是data的数据完全由data2保管, 两个的数据变化是一致的;- data3 = data.copy(), 深拷贝, 两个变量不湖影响;
import numpy as np
data = np.arange(8).reshape(2,4)
data
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
data1 = data
id(data)
140444611238448
id(data1)
140444611238448
data2 = data[::]
id(data)
140444611238448
id(data2)
140444621241360
id(data[0])
140444621241200
id(data2[0])
140444620515568
data
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
data2
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
np.where(data2<4,4,10)
array([[ 4, 4, 4, 4],
[10, 10, 10, 10]])
data2
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
data2[0] = 0
data2
array([[0, 0, 0, 0],
[4, 5, 6, 7]])
data
array([[0, 0, 0, 0],
[4, 5, 6, 7]])
data3 = data.copy()
data
array([[0, 0, 0, 0],
[4, 5, 6, 7]])
data3
array([[0, 0, 0, 0],
[4, 5, 6, 7]])
data3[0] = 10
data3
array([[10, 10, 10, 10],
[ 4, 5, 6, 7]])
data
array([[0, 0, 0, 0],
numpy中的nan和inf
nan(not a number): 表示不是一个数字, 代表的是数据缺失
inf(infinity): inf代表正无穷, -inf代表负无穷
nan的特殊属性:
- 两个nan的值是不相等的, 是float类型:
>>> np.nan == np.nan
False
>>> np.nan != np.nan
True
- 如何判断有多少个缺失值:
data = np.arange(12, dtype=np.float).reshape(3, 4)
data
array([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]])
data[:2, 2] = np.nan
data
array([[ 0., 1., nan, 3.],
[ 4., 5., nan, 7.],
[ 8., 9., 10., 11.]])
np.count_nonzero(data!=data)
2
data!=data
array([[False, False, True, False],
[False, False, True, False],
[False, False, False, False]])
# 判断data里面的缺失值
np.isnan(data)
array([[False, False, True, False],
[False, False, True, False],
[False, False, False, False]])
np.count_nonzero(np.isnan(data))
2
data[np.isnan(data)]=0
numpy中的常用数据统计
-
求和
-
均值
-
中值
-
最大值
-
最小值
-
极差
-
标准差: 代表的是数据的波动稳定情况, 数字越大, 越不稳定;
import numpy as np data = np.arange(12, dtype=np.float).reshape(3, 4) 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(data) 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))
numpy_学生身高体重统计分析案例
需求1:
获取所有男生的身高, 求平均值;获取所有女生的身高, 求平均值;并绘制柱状图显示
import numpy as np
from pyecharts import Bar
fname = "doc/eg6-a-student-data.txt"
dtype = np.dtype([('gender', '|S1'), ('height', 'f2')])
data = np.loadtxt(fname=fname, dtype=dtype, skiprows=9,
usecols=(1, 3))
# print(data)
# print(data['gender'])
# print(data['height'])
# print(data['height'][data['gender'] == b'M'].mean())
# print(data['height'][data['gender'] == b'F'].mean())
#
# 判断是否性别为那男的表达式
isMale = data['gender'] == b'M'
male_avg_height = data['height'][isMale].mean()
female_avg_height = data['height'][~isMale].mean()
print(male_avg_height, female_avg_height)
bar = Bar(title="不同性别身高的平均值")
bar.add("", ["男", '女'], [male_avg_height, female_avg_height])
bar.render()
需求2:
获取所有男生的体重, 求平均值;获取所有女生的体重, 求平均值;并绘制柱状图显示
def parser_weight(weight):
# 对于体重数据的处理, 如果不能转换为浮点数据类型, 则返回缺失值;
try:
return float(weight)
except ValueError as e:
return -99
fname = "doc/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, 3, 4), converters={4:parser_weight})
# 判断是否性别为男的平均身高
isMale = data['gender'] == b'M'
male_avg_height = data['height'][isMale].mean()
female_avg_height = data['height'][~isMale].mean()
print(male_avg_height, female_avg_height)
# 判断是否性别为男的平均体重
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()
print(male_avg_weight, female_avg_weight)
bar = Bar(title="不同性别身高的平均值")
bar.add("身高", ["男", '女'], [male_avg_height, female_avg_height])
bar.add("体重", ["男", '女'], [male_avg_weight, female_avg_weight])
bar.render()
"""
import numpy as np
from pyecharts import Bar
#
# def parser_bps(bps):
# # 对于体重数据的处理, 如果不能转换为浮点数据类型, 则返回缺失值;
# try:
#
# bps = bps.decode('utf-8').split('/')
# print(bps, type(bps))
# first_bps = float(bps[0])
# second_bps = float(bps[1])
# return first_bps, second_bps
# except ValueError as e:
# return -99
def parser_bpd(bpd):
# 对于体重数据的处理, 如果不能转换为浮点数据类型, 则返回缺失值;
try:
return float(bpd)
except ValueError as e:
return -99
fname = "doc/eg6-a-student-data.txt"
dtype = np.dtype([('gender', '|S1'), ('bpd', 'f2')])
data = np.loadtxt(fname=fname, dtype=dtype, skiprows=9,
usecols=(1, 6), converters={ 6:parser_bpd})
print(data)