写点什么

NumPy 之: 标量 scalars

发布于: 2021 年 04 月 25 日

简介

Python 语言中只定义了特定数据类的一种类型(比如只有一种整数类型,一种浮点类型等)。在不需要关注计算机中数据表示方式的普通应用程序中,这样做很方便。但是,对于科学计算来说,我们需要更加精确的控制类型。

在 NumPy 中,引入了 24 种新的 Python scalar 类型用于更加准确的描述数据。这些类型都是可以直接在 NumPy 中的数组中使用的,所以也叫 Array scalar 类型。

本文将会详细讲解这 24 种 scalar 类型。

scalar 类型的层次结构

先看一个张图,看下 scalar 类型的层次结构:



上面实线方框括起来的,就是 scalar 类型。 这些标量类型,都可以通过 np.type来访问,比如:

In [130]: np.intcOut[130]: numpy.int32
复制代码

细心的小伙伴可能要问了,这不对呀,实线方框括起来的只有 22 中类型,还有两个类型是什么?

还有两个是代表整数指针的 intp 和 uintp 。

注意,array scalars 类型是不可变的。

我们可以 isinstance 来对这些数组标量来进行层次结构的检测。

例如,如果 val 是数组标量对象,则 isinstance(val,np.generic)将返回 True。如果 val 是复数值类型,则 isinstance(val,np.complexfloating)将返回 True。

内置 Scalar 类型

我们用下面的表来展示内置的 Scalar 类型和与他们相对应的 C 类型或者 Python 类型。最后一列的字符代码是类型的字符表示,在有些情况比如构建 dtype 中会使用到。

boolean

Integers

Unsigned integers

Floating-point numbers

Complex floating-point numbers

Python 对象

对于数组中的对象类型object_来说,存储的数据其实是 Python 对象的引用,所以说他们的对象类型必须一致。

虽然存储的是引用,但是在取值访问的时候,返回的就是对象本身。

可以看到对于数字类型来说,int,uint,float,complex,后面可以跟上具体的数组,表示特定的长度。

intp 和 uintp 是两个指向整数的指针。

有些类型和 Python 自带的类型基本上是等价的,事实上这些类型就是继承自 Python 自带的类型:

有一个特例就是 bool_ ,它和 Python 的 BooleanType 非常类似,但并不是继承自 BooleanType。因为 Python 的 BooleanType 是不允许被继承的。并且两者底层的数据存储长度也是不一样的。

虽然在 Python 中 bool 是 int 的子类。但是在 NumPy 中 bool_ 并不是 int_ 的子类,bool_ 甚至不是一个 number 类型。

在 Python 3 中, int_ 不再继承 Python3 中的int了,因为int不再是一个固定长度的整数。

NumPy 默认的数据类型是 float_

可变长度数据类型

下面的三种数据类型长度是可变的,

字符代码中的 # 表示的是数字。

上面描述的字符代码,为了和 Python 的其他模块进行兼容,比如 struct ,需要进行下面适当的修正:

c -> S1b -> B1 -> bs -> hw -> H, 和 u -> I.


本文已收录于 http://www.flydean.com/03-python-numpy-scalar/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

发布于: 2021 年 04 月 25 日阅读数: 10
用户头像

关注公众号:程序那些事,更多精彩等着你! 2020.06.07 加入

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在公众号:程序那些事!

评论

发布
暂无评论
NumPy之:标量scalars