接着上一讲

切片是引用

切片在内存中使用的是引用机制。

引用机制意味着,Python并没有为b分配新的空间来存储它的值,而是让b指向了a所分配的内存空间,因此,改变b会改变a的值:

a = np.array([0,1,2,3,4,5])
b = a[2:4]
# b = array([2, 3])b[1] = 40
a
# a = [ 0  1  2 40  4  5]

而这种现象在列表中并不会出现:

a = [0,1,2,3,4,5]
b = a[1:3]
# b = [1, 2]b[1] = 40
a
# a = [0, 1, 2, 3, 4, 5]

这样做的好处在于,对于很大的数组,不用大量复制多余的值,节约了空间。
缺点在于,可能出现改变一个值改变另一个值的情况。

一个解决方法是使用 copy方法产生一个复制,这个复制会申请新的内存:

a = np.array([0,1,2,3,4,5])
b = a[2:4].copy()
b[1] = 10
a
# a = array([0, 1, 2, 3, 4, 5])

花式索引

切片只能支持连续或者等间隔的切片操作,要想实现任意位置的操作,需要使用花式索引 fancy slicing

一维花式索引

与range函数类似,我们可以使用arange函数来产生等差数组。

a = np.arrage(0,100,10)
# a = array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
index = [1,3,5]
y = a[index]
# y = array([10, 30, 50])

花式索引需要指定索引位置:还可以使用布尔数组来花式索引:

mask = np.array([0,1,2,3,0,0,0,4,2,0],dtype = "bool")
# mask = array([False,  True,  True,  True, False, False, False,  True,  True,False])
s = a[mask]
# s = array([10, 20, 30, 70, 80]),即将True的部分对应a的内容拿出来了

mask 必须是布尔数组,长度必须和数组长度相等。

二维花式索引

对于二维花式索引,我们需要给定行和列的值:
在这里沿用之前的数组:

a = np.array([[0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25],[30,31,32,33,34,35],[40,41,42,43,44,45],[50,51,52,53,54,55]])
a

返回的是一条次对角线上的5个值。

b = a[(0,1,2,3,4),(1,2,3,4,5)]
# b = array([ 1, 12, 23, 34, 45])
返回的是最后三行的第1,3,5列:
b = a[3:,(0,2,4)]
# b = array([[30, 32, 34],# [40, 42, 44],# [50, 52, 54]])

也可以使用mask进行索引:

mask = np.array([1,0,1,0,0,1],dtype = bool)
a[mask,2]
# array([ 2, 22, 52])

与切片不同,花式索引返回的是原对象的一个复制而不是引用

“不完全”索引

只给定索引的时候,返回整行

a[:3]
# array([[ 0,  1,  2,  3,  4,  5],# [10, 11, 12, 13, 14, 15],# [20, 21, 22, 23, 24, 25]])

这个时候也可用花式索引取出2,3,5行

mask = np.array([0,1,1,0,0,1],dtype = bool)
a[mask]
# array([[10, 11, 12, 13, 14, 15],# [20, 21, 22, 23, 24, 25],# [50, 51, 52, 53, 54, 55]])

where语句

where(array)
where函数会返回所有非零元素的索引。

一维数组

先看一维的例子:

a = np.array([70,2,30,4,5])

判断数组中的元素是不是大于10:

a > 10
# array([ True, False,  True, False, False])

数组中所有大于10的元素的索引位置:

np.where(a>10)
# (array([0, 2], dtype=int64),)

注意到where的返回值是一个元组。返回的是索引位置,索引[1,3]大于10的数

也可以直接用数组操作:

a[a>10]
# 或 a[np.where(a>10)]
# 所得结果均为 array([70, 30])

类型转换

首先是最原始的转换方式:

a = np.array([1.2,6],dtype = float)
# a = array([1.2, 6. ])

asarray函数

a = np.array([1.2,6],dtype = float)
np.asarray(a,dtype = int)

astype方法

a = np.array([1.2,6],dtype = float)
b = a.astype(int)
# b = array([1, 6])

astype方法返回一个新数组,不改变原数组的值

数组操作

我们以豆瓣10部高分电影为例

电影信息

# 电影名称
mv_name=['肖申克的救赎','控方证人','美丽人生','辛德勒名单','阿甘正传','霸王别姬','泰坦尼克号','这个杀手不太冷','教父','海上钢琴师']# 评分人数
mv_num = np.array([1231413,1234221,231122,323423,2131231,232424,4564564,3242341,123123,123124])# 评分
mv_score = np.array([9.5,9.8,9.2,9.3,9.5,9.3,9.5,9.3,9.7,9.9])# 电影时长
mv_length = np.array([142,123,234,211,242,122,234,212,123,243])

数组排序

sort函数
np.sort(mv_num)
argsort函数
sss = np.argsort(mv_num)

通过这样做就能很好知道其他的相关信息:

mv_name[sss[0]]
# 例如这样就知道点评人数最少的电影名称
求和
np.sum(mv_num)
# mv_num.sum()
最大值
np.max(mv_score)
# mv_score.max()
最小值
np.min(mv_score)
# mv_score.min()
标准差
np.std(mv_num)
# mv_num.std()
相关系数矩阵
np.cov(mv_score,mv_length)

多维数组操作

数组形状
a = np.arange(6)
a.shape = 2,3
# array([[0, 1, 2],#[3, 4, 5]])a.shape
#(2, 3)

与之相对的方法是reshape,但它不会修改原来数组的值,而是返回一个新的数组

a.reshape(2,3)
#array([[0, 1, 2],#[3, 4, 5]])

转置

a = a.reshape(2,3)
# a = array([[0, 1, 2],#[3, 4, 5]])
a.T      # 或 a.transpose()
# array([[0, 3],#[1, 4],#[2, 5]])
数组连接

有时我们需要将不同的数组按照一定的顺序连接起来:concatenate((a0,a1,…,aN),axis=0)

注意,这些数组要用()包括到一个元组中去。
除了给定的轴外,这些数组其他轴的长度必须是一样的。

x = np.array([[1,2,3,4],[5,6,7,8]])
y = np.array([[51,52,53,54],[65,66,67,68]])

默认沿着第一维进行连接:

z = np.concatenate((x,y))
# z = array([[ 1,  2,  3,  4],#[ 5,  6,  7,  8],#[51, 52, 53, 54],#[65, 66, 67, 68]])

沿着第二维进行连接:

z = np.concatenate((x,y),axis = 1)
# z = array([[ 1,  2,  3,  4, 51, 52, 53, 54],#[ 5,  6,  7,  8, 65, 66, 67, 68]])

注意到这里x和y的形状是一样的,还可以将它们连接成三维的数组,但是concatenate不能提供这样的功能,不过可以这样:

z = np.array((x,y))
# z = array([[[ 1,  2,  3,  4],#[ 5,  6,  7,  8]],#[[51, 52, 53, 54],#[65, 66, 67, 68]]])

事实上,Numpy提供了分别对应这三种情况的函数:

vstack(竖向连接)
np.vstack((x,y))
# z = array([[ 1,  2,  3,  4],#[ 5,  6,  7,  8],#[51, 52, 53, 54],#[65, 66, 67, 68]])
hstack(横向连接)
np.hstack((x,y))
# z = array([[ 1,  2,  3,  4, 51, 52, 53, 54],#[ 5,  6,  7,  8, 65, 66, 67, 68]])
dstack(三维连接)
np.dstack((x,y))
# z = array([[[ 1,  2,  3,  4],#[ 5,  6,  7,  8]],#[[51, 52, 53, 54],#[65, 66, 67, 68]]])

numpy内置函数

a = np.array([-1,3,-4,5])
# a = array([-1,  3, -4,  5])
求绝对值
b = np.abs(a)
# b = array([1, 3, 4, 5])
求指数
b = np.exp(a)
# b = array([3.67879441e-01, 2.00855369e+01, 1.83156389e-02, 1.48413159e+02])
求中值
b = np.median(a)
# b = 1.0
求累计和
b = np.cumsum(a)
# b = array([-1,  2, -2,  3], dtype=int32)

# Python 数据分析三剑客 numpy / pandas / matplotlib (numpy篇②)相关推荐

  1. python科学计算三剑客_《Python数据分析三剑客:Pandas、Numpy、Matplotlib》专题

    0 2019-10-07 矩阵 1. 矩阵初始化 Numpy函数库中存在两种不同的数据类型(矩阵matrix和数组array),都可以用于处...[作者空间] 20 2019-08-18 Matplo ...

  2. Python 数据分析三剑客之 Pandas(十):数据读写

    CSDN 课程推荐:<迈向数据科学家:带你玩转Python数据分析>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python ...

  3. Python 数据分析三剑客之 Pandas(九):时间序列

    CSDN 课程推荐:<迈向数据科学家:带你玩转Python数据分析>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python ...

  4. Python 数据分析三剑客之 Pandas(八):数据重塑、重复数据处理与数据替换

    CSDN 课程推荐:<迈向数据科学家:带你玩转Python数据分析>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python ...

  5. Python 数据分析三剑客之 Pandas(七):合并数据集

    CSDN 课程推荐:<迈向数据科学家:带你玩转Python数据分析>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python ...

  6. Python 数据分析三剑客之 Pandas(六):GroupBy 数据分裂、应用与合并

    CSDN 课程推荐:<迈向数据科学家:带你玩转Python数据分析>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python ...

  7. Python 数据分析三剑客之 Pandas(五):统计计算与统计描述

    CSDN 课程推荐:<迈向数据科学家:带你玩转Python数据分析>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python ...

  8. Python 数据分析三剑客之 Pandas(四):函数应用、映射、排序和层级索引

    CSDN 课程推荐:<迈向数据科学家:带你玩转Python数据分析>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python ...

  9. Python 数据分析三剑客之 Pandas(三):算术运算与缺失值的处理

    CSDN 课程推荐:<迈向数据科学家:带你玩转Python数据分析>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python ...

  10. Python 数据分析三剑客之 Pandas(二):Index 索引对象以及各种索引操作

    CSDN 课程推荐:<迈向数据科学家:带你玩转Python数据分析>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python ...

最新文章

  1. 关于全国大学生智能汽车竞赛有关问题的建议
  2. 时间戳显示为多少分钟前,多少天前的JS处理,JS时间格式化,时间戳的转换
  3. 微信小程序 解决请求服务器手机预览请求不到数据的方法
  4. php实现查询上传文件进度
  5. Android进阶:六、在子线程中直接使用 Toast 及其原理
  6. jquery 手指滑动多半屏_JS拖拽专题(五)——「玩出花儿来」移动端滑动事件的封装...
  7. include/caffe/common.cuh(9): error: function atomicAdd(double *, double) has already been defined
  8. 计算机技术与自动化期刊官网,计算技术与自动化是什么级别
  9. 伺服驱动器生产文件_直流伺服系统的组成和控制原理详解
  10. 英国四大运营商联合发文:驳斥“新冠病毒与5G有关”谣言
  11. Selenium 编写第一个自动化脚本
  12. centos gradle 安装
  13. Killer Problem
  14. cisco交换机命令大全(11)
  15. 软考中高项学员:2016年4月13日作业
  16. Component creation must be done on Event Dispatch Thread错误解决方法
  17. HEVC帧间预测之三——TEncCu::xCheckRDCostMerge2Nx2N函数分析
  18. 【软件设计师中级】设计模式之原型模式学习笔记(c++)
  19. OS学习笔记-3(清华大学慕课)系统启动流程及中断处理
  20. Mybatis深层理解之mybatis到底为我们做了什么?

热门文章

  1. Java的ygc fgc_java基础—常用的GC策略,什么时候会触发YGC,什么时候触发FGC?
  2. php多表头表格,HTML多表头表格代码_HTML/Xhtml_网页制作
  3. 【Linux】页表的实现与地址转换
  4. SSM,SSH,前端开发技术体系
  5. lapack安装 matlab,Windows Scipy安装:找不到Lapack / Blas资源
  6. java searchview_java – Searchview不工作,因为应用程序兼容
  7. “码”上出行,旅游中二维码的应用
  8. LogoErase:去除移印、丝印、印刷Logo,抹字水(防白水)
  9. 量子计算机的可行性分析,量子计算机体系结构及模拟技术的研究与实现
  10. 企业如何做IT运维自动化?