Python——NumPy的使用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Python——NumPy的使⽤
NumPy简介
Numpy提供了⼀个在Python中做科学计算的基础库,重在数值计算,主要⽤于处理多维数组(矩阵)的库。

⽤来存储和处理⼤型矩阵,⽐Python⾃⾝的嵌套列表结构要⾼效的多。

本⾝是由C语⾔开发,是个很基础的扩展,Python其余的科学计算扩展⼤部分都是以此为基础。

⾼性能科学计算和数据分析的基础包
ndarray,多维数组(矩阵),具有⽮量运算能⼒,快速、节省空间
矩阵运算,⽆需循环,可完成类似Matlab中的⽮量运算
线性代数、随机数⽣成
1、创建数组的3种⽅法
import random
import numpy as np
# numpy是帮助我们进⾏数值型计算的
a = np.array([1,2,3,4,5])
print(a) # [1 2 3 4 5]
print(type(a)) # <class 'numpy.ndarray'>
b = np.array(range(1,6))
print(b)
print(type(b))
c = np.arange(1,6)
print(c)
print(type(c))
# dtype:查看数组中数据的类型
print(c.dtype) # int64,默认是根据电脑位数来的
# 指定⽣成的数据类型
d = np.array([1,1,0,1],dtype=bool)
print(d) # [ True True False True]
# numpy中的⼩数
e = np.array([random.random() for i in range(4)])
print(e) # [0.8908038 0.4591454 0.38334215 0.08534364]
print(type(e)) # <class 'numpy.ndarray'>
print(e.dtype) # float64
# 取数据的⼏位⼩数
f = e.round(2) # 或者 f = np.round(e,2)
print(f) # [0.92 0.27 0.07 0.94]
2、数组的形状
import numpy as np
# 数组的形状
a = np.array([[1,3,4],[3,5,6]])
print(a)
"""
⼆维数组
[[1 3 4]
[3 5 6]]
"""
print(a.shape) # (2,3),代表着2⾏3列的数组
b = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
print(b)
"""
三维数组
[[[1 2 3]
[4 5 6]]
[[1 2 3]
[4 5 6]]]
"""
print(b.shape) # (2, 2, 3)
# 由于上⾯这种写法(⼏维数组)过于复杂
c = np.arange(12) # ⽣成⼀个⼀维数组
d = np.reshape(c,(3,4)) # 将1维数组转变成3*4的⼆维数组
print(d)
"""
3*4的⼆维数组
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
"""
e = np.arange(24)
f = e.reshape((2,3,4))
print(f)
"""
2*3*4的三维数组,其中2表⽰块数,3⾏4列
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
"""
# 三种⽅式将3维数组f,转成1维数组
g = f.reshape((24,)) # ⼀定要有, f.reshape((1,24))也⾏
h = f.reshape((f.shape[0]*f.shape[1]*f.shape[2],))
i = f.flatten()
print(g)
print(h)
print(i)
3、数组的计算
import numpy as np
# 数组的计算
a = np.array([i for i in range(12)])
b = a.reshape((3,4)) # 2维数组
print(b)
"""
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
"""
print(b+2)
"""
numpy会将数组中的所有元素+2,+—*/同理,下⾯看⼀个特殊的
[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
"""
# print(b/0)
"""
在numpy中,/0并不会报错,其中nan(not a number)代表未定义或不可表⽰的值,inf(infimum)表⽰⽆穷 [[nan inf inf inf]
[inf inf inf inf]
[inf inf inf inf]]
"""
# 两个相同结构的数组的+——*/
c = np.array([1,2,3,4])
d = np.array([5,6,7,8])
e = c.reshape((2,2))
f = d.reshape((2,2))
print(e+f)
"""
e:
[[1 2]
[3 4]]
f:
[[5 6
[7 8]]
e+f:
[[ 6 8]
[10 12]]
"""
# 因为⾏的维度两个数组是相同的,所以会对每⼀⾏进⾏+——*/运算
# 多维中有⼀个(或以上)维度相同的话就可以进⾏计算
# 所有维度都不相同,⽆法进⾏计算
4、加载csv数据
"""
加载csv数据
"""
us_file_path = "./youtube_video_data/US_video_data_numbers.csv" uk_file_path = "./youtube_video_data/GB_video_data_numbers.csv" """
fname:⽂件路径
delimiter:数据分隔符(默认为空格)
dtype:数据类型
skiprows:跳过多少⾏
usecols:选取指定的列(元组类型)
unpack:是否转置
"""
aaa = np.loadtxt(fname=us_file_path,delimiter=",",dtype=int)
5、转置操作
a = np.array([i for i in range(12)])
b = a.reshape((3,4))
print(b)
"""
转置的3中⽅法
转置:2维数组的⾏和列交换
"""
print(b.T)
print(b.transpose())
# 交换0轴和1轴
print(b.swapaxes(1,0))
6、取⾏/列
"""
取⾏/列
"""
# 取第3⾏
print(b[2])
# 取连续的多⾏(2~4⾏)
print(b[1:4])
# 取不连续的多⾏(1、3⾏)
print(b[[0,2]])
# 取第2列
print(b[:,1])
# 取连续的多列(1~3列)
print(b[:,0:3])
# 取不连续的多列(1,3列)
print(b[:,[0,2]])
# 取⾏列交叉的点(3⾏4列)
c = b[2,3]
print(c)
print(type(c))
#取多⾏和多列,取第3⾏到第五⾏,第2列到第4列的结果
#去的是⾏和列交叉点的位置
print(b[2:5,1:4])
#取多个不相邻的点
#选出来的结果是(0,0)(2,1)(2,3)
print(b[[0,2,2],[0,1,3]])
7、布尔索引、三元运算、裁剪"""
numpy中的布尔索引
"""
print(b)
"""
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
"""
print(b>5)
"""
[[False False False False]
[False False True True]
[ True True True True]]
"""
# Demo:将数组中>5的值改成5
print(b[b>5]) # [ 6 7 8 9 10 11]
b[b>5] = 5
"""
numpy中的三元运算
"""
# b中⼩于4的==>0,⼤于等于4的==>10
c = np.where(b<4,0,10)
# 注意:不会修改b,⽽是有⼀个返回值
print(c)
"""
numpy中的裁剪
"""
# ⼩于10的替换成10,⼤于18的替换成18
b.clip(10,18)
8、numpy中的nan和inf
nan(NAN,Nan):not a number表⽰不是⼀个数字
什么时候numpy中会出现nan:
当我们读取本地的⽂件为float的时候,如果有缺失,就会出现nan
当做了⼀个不合适的计算的时候(⽐如⽆穷⼤(inf)减去⽆穷⼤)
inf(-inf,inf):infinity,inf表⽰正⽆穷,-inf表⽰负⽆穷
什么时候回出现inf包括(-inf,+inf)
⽐如⼀个数字除以0,(python中直接会报错,numpy中是⼀个inf或者-inf)
注意点:
inf和nan都是float类型
那么问题来了,在⼀组数据中单纯的把nan替换为0,合适么?会带来什么样的影响?
⽐如,全部替换为0后,替换之前的平均值如果⼤于0,替换之后的均值肯定会变⼩,所以更⼀般的⽅式是把缺失的数值替换为均值(中值)或者是直接删除有缺失值的⼀⾏
那么问题来了:
如何计算⼀组数据的中值或者是均值
常⽤的统计函数
求和:t.sum(axis=None)
均值:t.mean(a,axis=None) 受离群点的影响较⼤
中值:np.median(t,axis=None)
最⼤值:t.max(axis=None)
最⼩值:t.min(axis=None)
极值:np.ptp(t,axis=None) 即最⼤值和最⼩值只差
标准差:t.std(axis=None)
默认返回多维数组的全部的统计结果,如果指定axis则返回⼀个当前轴上的结果
Demo:将数组中的nan替换成平均值
import numpy as np
def fill_ndarray(t1):
# 对每列进⾏操作
for i in range(t1.shape[1]):
# 获取当前列
temp_col = t1[:,i]
# 判断这列中有没有nan
nan_number = np.count_nonzero(temp_col!=temp_col)
if nan_number > 0:
# 获取当前列中不为nan的数组
temp_not_nan_col = temp_col[temp_col==temp_col]
# 找出nan,替换成平均值,或temp_col(np.isnan(temp_col)) = temp_not_nan_col.mean()
temp_col[temp_col!=temp_col] = temp_not_nan_col.mean()
return t1
if __name__ == '__main__':
t1 = np.arange(24).reshape((4, 6)).astype("float")
# 将第⼆⾏的3列以后赋值为nan
t1[1, 2:] = np.nan
t2 = fill_ndarray(t1)
print(t2)
更多好⽤⽅法
获取最⼤值最⼩值的位置
np.argmax(t,axis=0)
np.argmin(t,axis=1)
创建⼀个全0的数组: np.zeros((3,4))
创建⼀个全1的数组: np.ones((3,4))
创建⼀个对⾓线为1的正⽅形数组(⽅阵):np.eye(3)
numpy中的copy和view
a=b 完全不复制,a和b相互影响
a = b[:],视图的操作,⼀种切⽚,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是⼀致的,
a = b.copy(),复制,a和b互不影响
⽣成随机数

⼆维数组的轴:
三维数组的轴:。

相关文档
最新文档