浅入浅出数据分析之Hello NumPy系列(一)

2020,努力做一个无可替代的人!

作者 | 小一

978c7619a35b414ad73df494106baa78.png

全文共2758字,阅读全文需10分钟

写在前面的话

依照惯例,回顾一下上节内容:

上节介绍了最常用的部分高阶函数,也是我在实际项目中觉得效率比较高的函数之一了。

附上链接,大家自行复习:

今天开始新的系列,也是高阶部分的知识,难度会稍稍大一些,我打算多分几节。

哈哈,高阶部分我是没打算水文章,篇篇都是干货呦。

建议不要错过任何一节内容,最好把公众号设为星标42e90a1ea2619940dffa28f6171aa419.png

正文
背景

NumPy(Numerical Python 的简称)是高性能科学计算和数据分析的基础包,是 SciPy、Pandas 等数据科学的基础库,它所提供的数据结构比 Python 自身的更高级、更高效。

Numpy 提供了一种 ndarray 的多维数组结构,运算快速且节省空间。

思考一个问题,同样是多维数组,为什么不用 List 呢?

1. 虽然 Python 中隐去了指针的概念,但学过 c 语言的同学应该了解,数组中保存的是对象的指针,那 list 本身作为一个数组,也是这样保存的。
这样的话,比如一个数组 ['a', 'b', 'c'] 需要有3个指针和3个字符对象,太浪费


2. list 中的元素在系统内存中是分散存储的,而 ndarray 是存储在一个连续均匀的内存块中。

上面的回答如果你不是很懂,那你记住一点就行了:ndarray 无论是存储还是计算,都大大优于 Python 原有的数据结构

像我们平时 excel 中打开的数据大多是二维数组,有行有列

ndarray 也可以同样理解,区别的是:ndarray 中的所有元素必须是相同类型的

安装 NumPy 包

和安装其他基础包一样,直接在 cmd 中安装即可。

pip2 表示 2.x 版本,pip3 表示 3.x 版本

  • 启动cmd

  • 输入 pip3 install numpy


导入 NumPy
import numpy as np

这里需要提到一点:你可以不按照 NumPy 约定去写 np.,而直接在代码中使用 from numpy import *

但是非常不建议你这样做。

创建 ndarray
  • 使用 array 函数创建数组

  • 使用 arange 函数创建数组

  • 使用 zeros、ones 函数创建数组

  • 使用 empty 函数创建数组

  • 使用 eye 函数创建数组

数组的创建方法有很多种,以上列举的只是部分较常见的。

最简单的当然还是使用 array 函数

# 通过 array 函数创建一维数组
data_list = [0, 1, 2, 3, 4, 5]
data_arr1 = np.array(data_list)

# 通过 array 函数创建二维数组
data_list = [[1.1, 3.1, 2.1], [3.2, 4.2, 5.2]]
data_arr2 = np.array(data_list)

# 通过 reshape 方法重新构造数组
data_arr3 = np.array(range(0, 6)).reshape(2, 3)

同样是创建数组,np.array 会尝试为新建的这个数组推断出一个较为合适的数据类型

数据类型保存在一个特殊的 dtype 对象中,比如上面我们创建的三个数组:

# 输出数组的数据类型
data_arr1.dtype
data_arr2.dtype
data_arr3.dtype

# 输出
int32
float64
int32

可以看到,NumPy 自动的为我们选择了一个合适的数据类型。

当然,你也可以显示的说明数据类型:

(更多数据类型继续往下看)

# 显示的声明数据类型,float类型数据会自动转换为 int
data_list = [[1.1, 3.1, 2.1], [3.2, 4.2, 5.2]]
data_arr4 = np.array(data_list, dtype=np.int)

# 输出
[[1 3 2]
 [3 4 5]]

使用 arange 函数创建数组

arange 是 Python 内置函数 range 的数组版,但返回的是一个 ndarray 而不是列表

# 使用 arange 函数创建数组
data_arr_5 = np.arange(0, 6)

# 输出
[0 1 2 3 4 5]

使用 zeros 函数创建数组

zeros 可以创建指定长度和形状的全0数组,类似的还有 zeros_like 函数

zeros_like:以另一个数组为参数,并根据其形状和 dtype 创建一个全0数组。

# 通过 zeros 函数创建一维数组
data_arr6 = np.zeros(6)
# 输出
[0. 0. 0. 0. 0. 0.]

# 通过 zeros 函数创建二维数组
data_arr7 = np.zeros((2, 3))
# 输出
[[0. 0. 0.]
 [0. 0. 0.]]

# 通过 zeros_like 函数创建函数
data_arr8 = np.zeros_like(data_arr7)
# 输出
[[0. 0. 0.]
 [0. 0. 0.]]

使用 ones 函数创建数组

ones 函数类似 zeros 函数,不用的是 ones 创建一个全1数组,ones_like  同理

# 通过 ones 函数创建函数
data_arr9 = np.ones(6)

# 输出
[1. 1. 1. 1. 1. 1.]

使用 empty 函数创建数组

empty 函数会产生一个全0数组。

需要注意的是,大多情况下,它返回的是一些未初始化的垃圾值,而并不是 0

# 通过 empty 函数创建函数
data_arr10 = np.empty((2, 2))

# 输出
[[9.90263869e+067 8.01304531e+262]
 [2.60799828e-310 7.56601164e-307]]

使用 eye 函数创建数组

eye 函数会产生一个正方的 N*N 单位矩阵

单位矩阵:对角线为1, 其余为0

# 通过 eye 函数创建函数
data_arr11 = np.eye(4)

# 输出
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]

以上差不多是最常用的 NumPy  创建数组的几种方式。

我们在创建的时候可以显示的通过 dtype 声明数据类型,当然,NumPy  也可以自动识别并进行相应的转换。

提到数据类型,我们看一下 NumPy 的一些数据类型

类型类型代码说明
int8
unit8
i1、u1有符号和无符号的8位整型
int16
unit16
i1、u1有符号和无符号的16位整型
int32
unit32
i1、u1有符号和无符号的32位整型
int64
unit64
i1、u1有符号和无符号的64位整型
float16f2半精度浮点数
float32f4 或 f标准的单精度浮点数
float64f8 或 d标准的双精度浮点数
float128f16 或 g扩展精度浮点数
complex64
complex128
complex256
c8、c16、c32分别用两个32、64、128位浮点数表示的复数
bool存储 True 和 False 值的布尔类型
objectOPython 对象类型
string_S固定长度的字符串类型
unicode_U固定长度的 unicode 类型

所以,在显示声明数据类型的时候,也可以通过类型代码进行声明:

# 通过类型或类型代码显示声明数据类型
data_arr_float = np.array([0, 1, 2, 3, 4, 5], dtype=np.float64)
data_arr_float = np.array([0, 1, 2, 3, 4, 5], dtype='f8')

NumPy 中,可以通过创建的时候显示声明数据类型,还可以通过 astype 方法显示的转换其 dtype

例如,将整数类型转换成浮点类型

# 创建 int 数组
data_arr_int = np.array([0, 1, 2, 3, 4, 5])
data_arr_int.dtype

# 输出
int32

# 通过 dtype 函数转换数据类型
data_arr_float = data_arr_int.astype(np.float64)
data_arr_float.dtype

# 输出
float64

如果是浮点数转换为整数,则小数部分将会被截断

另外, NumPy 会自动将 Python 类型映射到等价的 dtype 上。

例如你写了 float,Numpy 会自动识别为 np.float64。

总结一下:

NumPy 的第一篇文章,简单的介绍了如何创建数组、NumPy 数据类型以及不同类型之间的转换。

比较基础,有一个大致的认识就好了。

NumPy 作为最基础的基础,当然我是建议大家都会的,通过创建数组的方法你就能看到,NumPy 和线性代数有很大联系,在以后的算法推导方面,有很大用处。

但是也不是说必须要都懂,知道有这个东西就行,遇到问题了再回过头翻文章查阅一下。

写在后面的话

基础的东西是有点枯燥乏味的,我尽可能的按照正常的思维逻辑去展开描述。

比如 NumPy 开头,我没有一开始就上干货内容,

正常人的思维逻辑应该是:为什么要学这个?有什么用?怎么学?

所以文章一开始,我是按照上面的三个问题为主线的,这也是我在学习编程的时候自己的一点心得,希望你们喜欢。

碎碎念一下

最全的干货已经开始了,大家不要掉队啊。

让我看看有多少人还看到这儿?点个在看让我看到你

72c974af2796eaa48e715a2f887a5d78.gif

Python 系列

入门:准备工作  运算符  数据类型①  数据类型②  流程控制  函数  文件  模块  异常

进阶:面向对象  正则表达式  多线程与多进程  JSON操作  时间序列  数据库操作  邮件发送

高阶:事半功倍的高阶函数

技巧:学习技巧①  学习技巧②  学习技巧③

爬虫系列

基础:准备工作  爬虫实现方式  Requests详解  BeautifulSoup详解

进阶:获取动态数据①  获取动态数据②

实战:爬取豆瓣电影  豆瓣电影分析  爬取链家租房

其他系列

学排版:Markdown排版教程

领资料: 100G+数据分析资料免费领

非技术系列

讲故事:小一的故事  和二三四们的故事

听故事:投稿故事①

投故事:看故事之前先看我

好巧啊,你也读到这了!    

点个在看让我看到你a09ea5dad6b925e19c27cb4a69a9701d.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值