《Hello NumPy》系列-数据类型与创建

463 阅读7分钟

文章首发:公众号『知秋小梦』

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



写在前面的话

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

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

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

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

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

建议不要错过任何一节内容,最好关注一下我噢


正文

背景

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

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

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

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

② 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 = [012345]
data_arr1 = np.array(data_list)

# 通过 array 函数创建二维数组
data_list = [[1.13.12.1], [3.24.25.2]]
data_arr2 = np.array(data_list)

# 通过 reshape 方法重新构造数组
data_arr3 = np.array(range(06)).reshape(23)

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

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

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

# 输出
int32
float64
int32

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

当然,你也可以显示的说明数据类型:(更多数据类型继续往下看)

# 显示的声明数据类型,float类型数据会自动转换为 int
data_list = [[1.13.12.1], [3.24.25.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(06)

# 输出
[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((23))
# 输出
[[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((22))

# 输出
[[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位整型
float16 f2 半精度浮点数
float32 f4 或 f 标准的单精度浮点数
float64 f8 或 d 标准的双精度浮点数
float128 f16 或 g 扩展精度浮点数
complex64、complex128、complex256 c8、c16、c32 分别用两个32、64、128位浮点数表示的复数
bool 存储 True 和 False 值的布尔类型
object O Python 对象类型
string_ S 固定长度的字符串类型
unicode_ U 固定长度的 unicode 类型

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

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

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

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

# 创建 int 数组
data_arr_int = np.array([012345])
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 开头,我没有一开始就上干货内容,

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

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

碎碎念一下

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

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


原创不易,欢迎点赞噢

文章首发:公众号【知秋小梦】

文章同步:掘金,简书


原文链接:《Hello NumPy》系列-数据类型与创建