Python入门教程(二):Numpy数组基础

您所在的位置:网站首页 故宫后妃居住安排 Python入门教程(二):Numpy数组基础

Python入门教程(二):Numpy数组基础

2022-05-28 10:06| 来源: 网络整理| 查看: 265

坚持写作两年,我的第一本书《数据分析之道——用数据思维指导业务实战》正式出版啦!

坚持写作两年,我的第一本书出版啦, 本周限时优惠,免费送30本!​mp.weixin.qq.com/s/2s4rCBKedyAdT7i9EQDtsw​mp.weixin.qq.com/s/2s4rCBKedyAdT7i9EQDtsw

Python中的数组操作几乎等同于Numpy数组操作,今天我们会展示用Numpy数组操作获取数据或者子数组,对数组进行分裂,变形和连接的例子。

首先,我们先介绍几类基本的数组操作:

数组的属性

确定数组的大小,形状,储存大小,数据类型

数组的索引:

获取和设置各个元素的值

数组的切分:

在大的数组中获取或设置更小的子数组

数组的变形

改变给定数组的形状

数组的拼接和分裂

将多个数组合并为一个,以及将一个数组分类为多个。

1 Numpy数组的属性

Numpy数组的属性包括ndim(数组的维度),shape(数组每个维度的大小),size(数组总的大小),dtype(数据类型)以及itemsize(每个数组元素的字节大小)下面我们通过几个示例来了解数组的属性。

首先,生成不同维度的数组。

import numpy as np np.random.seed(0) # 设置随机种子数,保证程序执行时每次都可以生成同样的随机数组 x1 = np.random.randint(10, size=6) # 一维数组 x2 = np.random.randint(10, size=(3, 4)) # 二维数组,创建三行四列的数组 x3 = np.random.randint(10, size=(3, 4, 5)) # 三维数组 x3 # 查看x3数组 # array([[[8, 1, 5, 9, 8], # [9, 4, 3, 0, 3], # [5, 0, 2, 3, 8], # [1, 3, 3, 3, 7]], # [[0, 1, 9, 9, 0], # [4, 7, 3, 2, 7], # [2, 0, 0, 4, 5], # [5, 6, 8, 4, 1]], # [[4, 9, 8, 1, 1], # [7, 9, 9, 3, 6], # [7, 2, 0, 3, 5], # [9, 4, 4, 6, 4]]])

其次,查看x3数组的属性,有结果可见,x3是一个3维的数组,每一个维度都有三行四列,其中一共包含60个元素。

print("x3 ndim: ", x3.ndim) print("x3 shape:", x3.shape) print("x3 size: ", x3.size) # x3 ndim: 3 # x3 shape: (3, 4, 5) # x3 size: 60

查看数组的数据类型

print("dtype:", x3.dtype) # dtype: int64

查看数组每个元素的字节大小,一般情况下nbytes=itemsize*size

print("itemsize:", x3.itemsize, "bytes") print("nbytes:", x3.nbytes, "bytes") # itemsize: 8 bytes # nbytes: 480 bytes2 数组索引-获取单个元素

一维数组

在一维数组中可以通过中括号指定索引获取第i个值。

x1 # array([5, 0, 3, 3, 7, 9])

python中的索引从0开始计数,直到n-1,以下例子获取了x1中的第1一个数值和第5个值。

x1[0] # 5 x1[4] # 7

负值索引可以获取末尾索引。

x1[-1] # 9 x1[-2] # 7

多维数组

在多维数组中,可以用逗号分隔的索引元组获取元素。

x2 # array([[3, 5, 2, 4], # [7, 6, 8, 8], # [1, 6, 7, 7]]) x2[0, 0] # 获取第一个维度中的第一个元素 # 3 x2[2, 0] # 获取第三个维度中的第一个元素 # 1 x2[2, -1] # 获取第三个维度中的倒数第一个元素 # 7 # 修改元素值 x2[0, 0] = 12 # 将第一维的第一个元素值改为12 x2 # array([[12, 5, 2, 4], # [ 7, 6, 8, 8], # [ 1, 6, 7, 7]])3 数组切片-获取子数组

切片(slice)符号为冒号加中括号,可以获取子数组,其语法与python列表的标准切片语法相同,包括三个参数,分别是开始位置,结束位置,bu cha其表现形式如下:

x[start:stop:step]

一维子数组

x = np.arange(10) x # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) # 获取前五个元素 x[:5] # array([0, 1, 2, 3, 4]) # 获取索引5之后的元素 x[5:] # array([5, 6, 7, 8, 9]) # 获取索引4-7的元素 x[4:7] # array([4, 5, 6]) # 每隔一个元素 x[::2] # array([0, 2, 4, 6, 8]) # 每隔一个元素,从索引1开始 x[1::2] # array([1, 3, 5, 7, 9]

一维逆序数组

# 所有元素逆序排列 x[::-1] # array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0]) # 从索引5开始,每隔一个元素逆序 x[5::-2] # array([5, 3, 1])

多维子数组

多维切片也采用同样的处理方式,用逗号分隔。

x2 # array([[12, 5, 2, 4], # [ 7, 6, 8, 8], # [ 1, 6, 7, 7]]) # 截取两行三列 x2[:2, :3] # array([[12, 5, 2], # [ 7, 6, 8]]) # 所有行每隔一列 x2[:3, ::2] # array([[12, 2], # [ 7, 8], # [ 1, 7]]) #子数组维度逆序 x2[::-1, ::-1] # array([[ 7, 7, 6, 1], # [ 8, 8, 6, 7], # [ 4, 2, 5, 12]])

获取数组的行和列

如果需要获取数组的单行或者单列,可以通过索引与切片组合起来实现这个功能,用冒号(:)来表示这个功能。

# 获取x2的第一列 print(x2[:, 0]) # [12 7 1] # 获取x2的第一行 print(x2[0, :]) # [12 5 2 4] print(x2[0]) # [12 5 2 4] 在获取行数时,出于语法的简洁考虑,可以省略空的切片。如上例所示,x2[0, :]=x2[0]4 数组的变形

reshape()函数实现数组的变形

reshape()函数实现数组的变形需要保证的是,与啊是数组的大小必须和变形后的数组大小保持一致。

#将1-9放入到3*3的矩阵中 grid = np.arange(1, 10).reshape((3, 3)) print(grid) # [[1 2 3] # [4 5 6] # [7 8 9]]

reshape()或newaxis()将一维数组转换为二维数组的行或列的矩阵

x = np.array([1, 2, 3]) # 通过变形获得的行向量 x.reshape((1, 3)) # array([[1, 2, 3]]) # 通过newaxis获得的行向量 x[np.newaxis, :] # array([[1, 2, 3]]) # 通过变形获得的列向量 x.reshape((3, 1)) # array([[1], # [2], # [3]]) # 通过newaxis获得的列项量 x[:, np.newaxis] # array([[1], # [2], # [3]])5 数组的拼接和分裂

数据的拼接

当我们遇到多个数组,想要把这些数组合并到一起就涉及到了数组的拼接,常用的拼接函数有np.concatenate, np.vstack, 和np.hstack,具体用法请看下面示例。

# np.concatenate将元素或列表作为第一参数 x = np.array([1, 2, 3]) y = np.array([3, 2, 1]) np.concatenate([x, y]) # array([1, 2, 3, 3, 2, 1]) # np.concatenate也可以拼接多个数组 z = [99, 99, 99] print(np.concatenate([x, y, z])) # [ 1 2 3 3 2 1 99 99 99] # 拼接多维数组 grid = np.array([[1, 2, 3], [4, 5, 6]]) # 沿着第一个轴拼接 np.concatenate([grid, grid]) # array([[1, 2, 3], # [4, 5, 6], # [1, 2, 3], # [4, 5, 6]]) # 沿着第二个轴拼接,从0开始索引 np.concatenate([grid, grid], axis=1) # array([[1, 2, 3, 1, 2, 3], # [4, 5, 6, 4, 5, 6]])

np.vstack(垂直栈)和np.hstack(水平栈)实现沿着固定维度处理数组。

x = np.array([1, 2, 3]) grid = np.array([[9, 8, 7], [6, 5, 4]]) # 垂直栈数组 np.vstack([x, grid]) # array([[1, 2, 3], # [9, 8, 7], # [6, 5, 4]]) # 水平栈数组 y = np.array([[99], [99]]) np.hstack([grid, y]) # array([[ 9, 8, 7, 99], # [ 6, 5, 4, 99]])

与拼接相反的过程是分裂,分裂常用到的函数有np.split, np.hsplit, and np.vsplit函数实现,可以向上传递一个索引列表作为参数,索引列表记录为分裂点位置。N个分裂点会得到N+1个子数组

x = [1, 2, 3, 99, 99, 3, 2, 1] x1, x2, x3 = np.split(x, [3, 5]) print(x1, x2, x3) # [1 2 3] [99 99] [3 2 1] grid = np.arange(16).reshape((4, 4)) grid # array([[ 0, 1, 2, 3], # [ 4, 5, 6, 7], # [ 8, 9, 10, 11], # [12, 13, 14, 15]]) upper, lower = np.vsplit(grid, [2]) print(upper) print(lower) # [[0 1 2 3] # [4 5 6 7]] # [[ 8 9 10 11] # [12 13 14 15]] left, right = np.hsplit(grid, [2]) print(left) print(right) # [[ 0 1] # [ 4 5] # [ 8 9] # [12 13]] # [[ 2 3] # [ 6 7] # [10 11] # [14 15]] 在公众号后台回复【Nnupy基础】,即可获得本文全部代码!

数据分析师除了掌握数据分析工具之外,拥有数据思维也是极为重要的。

数据分析师这个岗位并不直接参与到业务决策中,就算数据分析师提出合理、切实可行的意见或建议,业务方也不一定采纳。所以这类问题考验的已经不是数据分析师基础的数据分析能力,更多的是其软技能、沟通能力及影响力。数据分析师在提出意见和建议时可以考虑用图表代替文字说明问题,用业务方听得懂的话代替专业术语陈述建议。另外,如果你的建议能够帮助业务方提升 KPI,那么业务方多少会对你的建议感兴趣。当然,从不同的业务出发,从不同的分析角度着手,都能提出各种不同的建议。所以本节只是抛砖引玉,至于如何在不同业务形态中提出合理、可行的建议,就需要数据分析师在实践中积累了。

市面上大部分数据分析相关的书籍都是从工具的介绍开始的,但很多时候数据分析主要依靠数据思维。特别是面对复杂业务场景时,对于业务的熟悉程度及数据思维显得尤为重要。因为数据思维决定了分析问题的角度及合理性,只要数据分析师能够针对特定问题提出分析方案,无论用什么工具都可以得到结果,因此数据思维是数据分析师成长进阶路上的必修课。而市面上关于数据思维的书籍较少且部分书籍讲授的知识点较浅,能够将数据思维、编程语言、统计学思想及案例分析等融为一体的书籍少之又少,强烈给大家推荐这本以数据分析全流程为主线的数据思维的书——《数据分析之道——用数据思维指导业务实战》

附上全书的目录,本书围绕数据思维展开,一共11章内容。

python系列文章持续更新中

往期推荐

史上最全的统计学基础知识!错过这次再等一年!!

你的Python 基础知识是成体系的吗?这套核心知识体系思维导图送给你!

SQL知识大全(六):SQL中的开窗函数

史上最全的MySQL 字符串函数,赶紧收藏!!

SQL知识大全(五):SQL中的时间函数

这份干货请你收好,长达2万字的时间函数总结,建议收藏!

分享数据知识,成就数据理想

点个在看 你最好看



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3