文章图片
文章目录
- 每篇前言
- 一、拷贝
-
- 1. 赋值
- 2. 视图
- 3. 副本
- 4. 注意点copy和view
- 二、numpy常用方法
-
- 1. 小技巧
- 2. 生成随机数
- 三、numpy中的nan和inf
- 四、书籍推荐
每篇前言
一、拷贝 1. 赋值 简单的赋值不会创建数组对象的副本。相反,它使用原始数组的相同id()来访问它。id()返回Python对象的通用标识符,类似于C中的指针。
作者介绍:Python领域优质创作者、华为云享专家、阿里云专家博主、2021年CSDN博客新星Top6
- 本文已收录于Python全栈系列专栏:《100天精通Python从入门到就业》
- ??此专栏文章是专门针对Python零基础小白所准备的一套完整教学,从0到100的不断进阶深入的学习,各知识点环环相扣
- 订阅专栏后续可以阅读Python从入门到就业100篇文章;还可私聊进两百人Python全栈交流群(手把手教学,问题解答); 进群可领取80GPython全栈教程视频 + 300本计算机书籍:基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。
- 加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!
文章图片
文章图片
一个数组的任何变化都反映在另-个数组上。例如,一个数组的形状改变也会改变另一个数组的形状
>>> import numpy as np
>>>
>>> x = np.array([1, 2, 3, 4, 5, 6])
>>> print("x数组: ")
x数组:
>>> print(x)
[1 2 3 4 5 6]
>>>
>>> print(id(x))
2545959638000
>>> y = x
>>> print(id(y))
2545959638000
>>>
>>> y.shape = (3, 2)
>>> print(y)
[[1 2]
[3 4]
[5 6]]
>>>
>>> print(x)
[[1 2]
[3 4]
[5 6]]
2. 视图 又可称为浅拷贝,是数据的一个别称或引用,通过该别称或引用亦便可访问、操作原有数据,但原有数据不会产生拷贝。对视图进行修改,它会影响到原始数据,物理内存在同一位
发生情况:
- numpy的切片操作返回原数据的视图,修改数据会影响到原始数组
>>> import numpy as np >>> x = np.arange(12) >>> print("x数组: ") x数组: >>> >>> print(x) [ 0123456789 10 11] >>> >>> print("创建切片y:") 创建切片y: >>> y = x[3:] >>> print(y) [ 3456789 10 11] >>> >>> print("修改切片y,查看x与y") 修改切片y,查看x与y >>> y[1] = 100 >>> print("查看y: ") 查看y: >>> print(y) [3 100567891011] >>> print("查看x: ") 查看x: >>> print(x) [0123 100567891011]
- 调用ndarray的view()函数产生一个视图创建一个新的数组对象,该方法创建的新数组的维数更改不会更改原始数据的维数
>>> import numpy as np >>> >>> x = np.arange(6).reshape((3, 2)) >>> print("x数组: ") x数组: >>> print(x) [[0 1] [2 3] [4 5]] >>> >>> print("创建x的视图y:") 创建x的视图y: >>> y = x.view() >>> print(y) [[0 1] [2 3] [4 5]] >>> >>> print("对比x与y的地址: ") 对比x与y的地址: >>> print("x的地址: ") x的地址: >>> print(id(x)) 2546234302800 >>> print("y的地址: ") y的地址: >>> print(id(y)) 2546234302896 >>> print("修改y,查看x与y") 修改y,查看x与y >>> y[1][0] = 100 >>> print("查看y: ") 查看y: >>> print(y) [[01] [1003] [45]] >>> print("查看x: ") 查看x: >>> print(x) [[01] [1003] [45]]
发生情况:
- 调用ndarray的copy()函数产生一个副本
- 作用:创建一个副本
- 说明:对副本数据进行修改,不会影响到原始数据,它们物理内存不在同一位置
>>> import numpy as np
>>>
>>> x = np.array([[10, 10], [2, 3], [4, 5]])
>>> print("x数组: ")
x数组:
>>> print(x)
[[10 10]
[ 23]
[ 45]]
>>>
>>> print("创建x的深层副本y")
创建x的深层副本y
>>> y = x.copy()
>>> print(y)
[[10 10]
[ 23]
[ 45]]
>>>
>>> print(y is x)
False
>>>
>>> print(y)
[[10 10]
[ 23]
[ 45]]
4. 注意点copy和view
a=b
:完全不复制,a和b相互影响a = b[:]
:视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,a = b.copy()
:复制,a和b互不影响
# 一维数组
>>> t1
array([11, 12, 13, 14, 15, 16, 17, 18, 19])
>>> np.argmax(t1,axis=0) #返回最大值索引
8
>>> np.argmin(t1,axis=0) #返回最小值索引
0# 多维数组就返回每行的最大或最小值
>>> t2 = np.arange(0,16).reshape(4,4)
>>> t2
array([[ 0,1,2,3],
[ 4,5,6,7],
[ 8,9, 10, 11],
[12, 13, 14, 15]])
>>> np.argmax(t2,axis=0)
array([3, 3, 3, 3], dtype=int64)
>>> np.argmin(t2,axis=0)
array([0, 0, 0, 0], dtype=int64)
2)创建一个全0的数组:
np.zeros((3,4))
>>> np.zeros((3,4))
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
3)创建一个全1的数组:
np.ones((3,4))
>>> np.ones((3,4))
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
4)创建一个对角线为1的正方形数组(方阵):
np.eye(3)
>>> np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
>>> np.eye(10)
array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])
2. 生成随机数
方法 | 说明 |
---|---|
np.random.rand(d0, d1,.. dn) |
创建d0-dn维度的均匀分布的随机数数组,浮点数,范围从0-1 |
np.random.randn(d0,d1,. .dn) |
创建d0-dn维度的标准正态分布随机数,浮点数,平均数0,标准差1 |
np.random.randint(low, high,(shape)) (常用) |
从给定上下限范围选取随机数整数,范围是low,high,形状是shape |
np.random.uniform( low, high,(size)) |
产生具有均匀分布的小数数组,low起始值,high结束值,size形状 |
np.random.normal(loc, scale,(size)) |
从指定正态分布中随机抽取样本,分布中心是loc (概率分布的均值) ,标准差是scale,形状是size |
np.random.seed(s) |
随机数种子,s是给定的种子值。因为计算机生成的是伪随机数,所以通过设定相同的随机数种子,可以每次生成相同的随机数 |
>>> np.random.randint(10,20,(3,3))
array([[13, 15, 18],
[18, 17, 15],
[15, 10, 12]])
>>> np.random.randint(10,20,(3,3))
array([[17, 12, 16],
[10, 10, 14],
[15, 14, 12]])
三、numpy中的nan和inf nan(NAN,Nan):not a number表示不是一个数字
什么时候numpy中会出现nan:
- 当我们读取本地的文件为float的时候,如果有缺失,就会出现nan
- 当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)
什么时候回出现inf包括(-inf,+inf):
- 比如一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf)
>>> type(np.nan)
>>> type(np.inf)
- 1.两个nan是不相等的
>>> np.nan == np.nan False
- 2.np. nan! =np. nan
>>> np.nan != np.nan True
- 3.利用以上的特性,判断数组中nan的个数
>>> b = np.array([1,2,3,4,5],dtype='float') >>> b array([1., 2., 3., 4., 5.]) >>> b[b==1.] = np.nan >>> b array([nan,2.,3.,4.,5.]) >>> b[b==2.] = np.nan >>> b array([nan, nan,3.,4.,5.]) >>> np.count_nonzero(b!=b) 2
- 4.由于2,那么如何判断-个数字是否为nan呢?通过np.isnan(a)来判断,返回bool类型,比如希望把nan替换为0
>>> b array([nan, nan,3.,4.,5.]) >>> np.count_nonzero(np.isnan(b)) 2
- 5、nan和任何值计算都为nan
>>> import numpy as np>>> t1 = np.arange(1,11).reshape(2,5) >>> t1 array([[ 1,2,3,4,5], [ 6,7,8,9, 10]]) >>> np.sum(t1) 55 >>> np.sum(t1,axis=0) # axis=0表示每列相加的结果 array([ 7,9, 11, 13, 15]) >>> np.sum(t1,axis=1) # axis=1表示每行相加的结果 array([15, 40])>>> t2 = np.array([1,2,3,4,5],dtype='float') >>> t2[t2==1.] = np.nan >>> t2 array([nan,2.,3.,4.,5.]) >>> np.sum(t2) nan
比如,全部替换为0后,替换之前的平均值如果大于0,替换之后的均值肯定会变小,所以更一般的方式是把缺失的数值替换为均值(中值)或者是直接删除有缺失值的一行
那么问题来了:
- 如何计算一组数据的中值或者是均值
- 如何删除有缺失数据的那一行(列)[在pandas中介绍]
文章图片
【python|100天精通Python(数据分析篇)——第52天(numpy完结)】【书籍内容简介】
- 包括人工智能概述、机器学习、神经网络与深度学习、智能语音处理及应用、计算机视觉处理及应用、自然语言处理及应用、知识图谱及应用、机器人、经典智能算法 Python 实现、展望等。
本书适合作为高等院校人工智能、计算机科学与技术、大数据、软件工程或相关专业的入门教材,也适合从事相关工作的人工智能爱好者和工程师学习阅读。
- 京东自营:https://item.jd.com/13287419.html
推荐阅读
- 工具使用|如何修改Jupyter Notebook工具的初始工作目录
- Excel|Day3 数据分析 Excel重要函数【零基础】
- Excel|Day2 数据分析 Excel-基础函数【零基础】
- 机器学习|python—sklearn特征提取
- 计算机视觉|opencv-python 机器视觉(宽度测量)
- #|YOLOv5的Tricks | 【Trick14】YOLOv5的val.py脚本的解析
- 项目|python文件中导入同目录下其他py文件
- pytorch入门|pytorch学习笔记——3.6~3.7Pytorch中定义网络的方式以及模型保存和加载方法
- PTA|2021 RoboCom 世界机器人开发者大赛-高职组(复赛)