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

xiaoyi
xiaoyi
xiaoyi
14
文章
0
评论
2021-03-2911:59:26 评论 289 3000字
摘要

本文简单的介绍了如何创建数组、NumPy 数据类型以及不同类型之间的转换。比较基础,有一个大致的认识就好了。当然我是建议大家都会的,通过创建数组的方法你就能看到,NumPy 和线性代数有很大联系,在以后的算法推导方面,有很大用处。

一、背景

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.dtypedata_arr2.dtypedata_arr3.dtype# 输出int32float64int32

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

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

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

# 显示的声明数据类型,float类型数据会自动转换为 intdata_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 的一些数据类型

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

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

# 通过类型或类型代码显示声明数据类型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 和线性代数有很大联系,在以后的算法推导方面,有很大用处。。但是也不是说必须要都懂,知道有这个东西就行,遇到问题了再回过头翻文章查阅一下。

End.

爱数据网专栏作者:xiaoyi

作者介绍:数据分析从业者,金融风控爱好者,不定期原创技术分享,努力成为数据分析、金融风控领域的终身学习者、实践者、传播者

个人微信公众号:小一的学习笔记(ID:xiaoyi_learning)

本文为挖数网专栏作者原创文章,未经允许禁止转载,需要转载请微信联系授权(微信号:lovedata0520)

  • 我的微信公众号
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: