NumPy 基础

Posted 诗雨时

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NumPy 基础相关的知识,希望对你有一定的参考价值。

系列文章目录

Python数据科学家养成计划(NumPy学习指南)


文章目录


前言

随着人工智能的不断发展,数据科学相关技术也越来越重要,很多人都开启了学习数据科学相关知识体系的学习之旅,本文就介绍了数据科学中 Numpy 科学计算库的基础内容。

一、NumPy 数组对象

NumPy 中的 ndarray 是一个多维数组对象,该对象由两部分组成:

  • 实际的数据;
  • 描述这些数据的元数据。

大部分的数组操作仅仅修改元数据部分,而不改变底层的实际数据。

NumPy 数组一般是同质的(但有一种特殊的数组类型例外,它是异质的),即数组中的所有元素类型必须是一致的。这样有一个好处:如果我们知道数组中的元素均为同一类型,该数组所需的存储空间就很容易确定下来。

与 Python 一样,NumPy 数组的下标也是从 0 开始的。数组元素的数据类型用专门的对象表示。

用 arange() 函数创建数组,并获取其数据类型
(1) 引入库
代码如下(示例):

import numpy as np

(2) 创建数组
代码如下(示例):

data = np.arange(5)
print(data)
# [0, 1, 2, 3, 4]

(3) 获取数组的类型
代码如下(示例):

type(data)
# <class 'numpy.ndarray'>

(3) 获取数组的数据类型
代码如下(示例):

data.dtype
# int32

(4) 获取数组的维度
代码如下(示例):

data.shape
# (5,)

代码分析:

  • 这是一个包含 5 个元素的向量,取值分别为 0 ~ 4 的整数。
  • 数组 data 的数据类型为 int32(在我的机器上是这样),当然如果你使用 64 位的 Python,得到的结果可能是 int64。不论是哪种情形,该数组的数据类型都是正数(64 位或 32 位)。
  • 数组 data 的 shape 属性返回一个元组(tuple),元组中的元素即为 NumPy 数组每一个维度上的大小。上面例子中的数组是一维的,因此元组中只有一个元素。

二、创建多维数组

我们已经知道了如何创建向量,现在可以试着创建多维的 NumPy 数组,并查看其维度。
(1) 创建一个多维数组。
(2) 显示该数组的维度。

a = list(np.arange(2))
b = list(np.arange(2))]
data = np.array([a, b)

# 查看数组数据
print(data)

# 查看数组维度
print(data.shape)
[[0 1]
 [0 1]]
(2, 2)

代码分析:

  • 使用 arange() 函数创建数组并将其类型转换为 list,赋值给变量 a;
  • 使用 arange() 函数创建数组并将其类型转换为 list,赋值给变量 b;
  • 将 a 和 b 作为列表元素,把这个列表作为参数传给 array() 函数,从而创建了一个 2 x 2 的数组,并将创建生成的数组赋值给变量 data;
  • 使用 shape 属性查看数组 data 的维度。

array() 函数可以依据给定的对象生成数组。给定的对象应是类数组,如 Python 中的列表。

练习:创建 3 x 3 的多维数组

data = np.array([list(np.arange(3)), list(np.arange(3)), list(np.arange(3))])

# 查看数组数据
print(data)

# 查看数组维度
print(data.shape)

# 查看数组维度类型
print(type(data.shape))
[[0 1 2]
 [0 1 2]
 [0 1 2]]
(3, 3)
<class 'tuple'>

1. 选取数组元素

(1) 创建一个 2 x 2 的数组

# 给 array() 函数传入一个嵌套的列表作为参数创建数组

data = np.array([[1, 2], [3, 4]])
print(data)
[[1 2]
 [3 4]]

(2) 依次选取该数组中的元素

# 依次选取数组中的元素,数组的下标从 0 开始

print(data[0, 0])
print(data[0, 1])
print(data[1, 0])
print(data[1, 1])
1
2
3
4

是的,从数组中选取元素就是这么简单。对于数组 data,只需要用 data[m, n] 选取各数组元素,其中 m 和 n 为元素下标,对应的位置如下标所示:

2. NumPy 数据类型

除了 Python 原有的 整型、浮点型、复数型 数据类型之外,因科学计算的需要,NumPy 添加了很多其他的数据类型。

在实际应用中,我们需要不同精度的数据类型,它们占用的内存空间是不同的。

在 NumPy 中,大部分数据类型名是以数字结尾的,这个数字表示其在内存中占用的位数。

NumPy 支持的数据类型

NumPy 类型描述
bool用一位存储的布尔类型(值为 True 或 False)
inti由所在平台决定其精度的整数(一般为 int32 或 int64)
int8整数,范围为 -128 至 127
int16整数,范围为 -32 768 至 32 767
int32整数,范围为 -2^31至 2^31 - 1
int64整数,范围为 -2^63 至 2^63 - 1
uint8无符号整数,范围为 0 至 255
uint16无符号整数,范围为 0 至 65535
uint32无符号整数,范围为 0 至 2^32 - 1
uint64无符号整数,范围为 0 至 2^64 - 1
float16半精度浮点数(16 位):其中 1 位表示正负号,5 位表示指数,10 位表示尾数
float32单精度浮点数(132 位):其中 1 位表示正负号,8 位表示指数,23 位表示尾数
float64 或 float双精度浮点数(64 位):其中 1 位表示正负号,11 位表示指数,52 位表示尾数
complex64复数,分别用两个 32 位浮点数表示实部和虚部
complex128 或 complex复数,分别用两个 64 位浮点数表示实部和虚部

在 NumPy 中,许多函数的参数中可以指定数据类型,通常这个参数是可选的:

data = np.arange(7, dtype="uint16")

print(data)
print(type(data))
print(data.dtype)
[0 1 2 3 4 5 6]
<class 'numpy.ndarray'>
uint16

复数与整数的相互转换

  • 复数不能转换为整数,这将触发 TypeError 错误;
  • 整数可以转换为复数。
int(42.0 + 1.j)

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
C:\\Users\\Public\\Documents\\Wondershare\\CreatorTemp/ipykernel_16676/2731522470.py in <module>
----> 1 int(42.0 + 1.j)

TypeError: can't convert complex to int
complex(42)

(42+0j)

复数与浮点数的相互转换

  • 复数不能转换为浮点数,这将触发 TypeError 错误;
  • 浮点数可以转换为复数。
float(42.0 + 1.j)

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
C:\\Users\\Public\\Documents\\Wondershare\\CreatorTemp/ipykernel_16676/1536418014.py in <module>
----> 1 float(42.0 + 1.j)

TypeError: can't convert complex to float
complex(42.0)

(42+0j)

3. 数据类型对象

数据类型对象是 numpy.dtype 类的实例。
如前所述,NumPy 数组是有数据类型的,更确切地说,NumPy 数组中的每一个元素均为相同的数据类型。
数据类型对象可以给出单个数组元素在内存中占用的字节数,即 dtype 类的 itemsize 属性:

data = np.arange(7, dtype="int64")

print(data)
print(data.dtype)
print(data.dtype.itemsize)
[0 1 2 3 4 5 6]
int64
8

4. 字符编码

NumPy 可以使用字符编码来表示数据类型,这是为了兼容 Numeric。
不推荐使用字符编码。读者应优先使用 dtype 对象来表示数据类型。

NumPy 支持的表示数据类型的字符编码

数据类型字符编码
整数i
无符号整数u
单精度浮点数f
双精度浮点数d
布尔值b
复数D
字符串S
unicode 字符串U
void(空)V

使用字符编码创建单精度浮点数数组

data = np.arange(7, dtype="f")

print(data)
print(data.dtype)
[0. 1. 2. 3. 4. 5. 6.]
float32

使用字符编码创建复数数组

data = np.arange(7, dtype="D")

print(data)
print(data.dtype)
[0.+0.j 1.+0.j 2.+0.j 3.+0.j 4.+0.j 5.+0.j 6.+0.j]
complex128

5. 自定义数据类型

我们可以使用多种方式自定义数组的数据类型,以浮点型为例:

  • 使用 Python 中的浮点数类型:
np.dtype(float)

dtype('float64')
data = np.arange(7, dtype=float)

print(data)
print(data.dtype)

[0. 1. 2. 3. 4. 5. 6.]
float64
  • 使用字符编码来指定单精度浮点数类型:
np.dtype("f")

dtype('float32')
data = np.arange(7, dtype="f")

print(data)
print(data.dtype)

[0. 1. 2. 3. 4. 5. 6.]
float32
  • 使用字符编码来指定双精度浮点数类型:
np.dtype("d")

dtype('float64')
data = np.arange(7, dtype="d")

print(data)
print(data.dtype)

[0. 1. 2. 3. 4. 5. 6.]
float64
  • 将两个字符作为参数传给数据类型的构造函数。此时,第一个字符表示数据类型,第二个字符表示该类型在内存中占用的字节数(2、4、8 分别代表精度为 16、32、64 位的浮点数):
np.dtype("f8")

dtype('float64')
data = np.arange(7, dtype="f8")

print(data)
print(data.dtype)

[0. 1. 2. 3. 4. 5. 6.]
float64

使用 numpy.sctypeDict.keys() 查看完整的 NumPy 数据类型

np.sctypeDict.keys()
dict_keys(['?', 0, 'byte', 'b', 1, 'ubyte', 'B', 2, 'short', 'h', 3, 'ushort', 'H', 4, 'i', 5, 'uint', 'I', 6, 'intp', 'p', 9, 'uintp', 'P', 10, 'long', 'l', 7, 'L', 8, 'longlong', 'q', 'ulonglong', 'Q', 'half', 'e', 23, 'f', 11, 'double', 'd', 12, 'longdouble', 'g', 13, 'cfloat', 'F', 14, 'cdouble', 'D', 15, 'clongdouble', 'G', 16, 'O', 17, 'S', 18, 'unicode', 'U', 19, 'void', 'V', 20, 'M', 21, 'm', 22, 'bool8', 'b1', 'int64', 'i8', 'uint64', 'u8', 'float16', 'f2', 'float32', 'f4', 'float64', 'f8', 'complex64', 'c8', 'complex128', 'c16', 'object0', 'bytes0', 'str0', 'void0', 'datetime64', 'M8', 'timedelta64', 'm8', 'Bytes0', 'Datetime64', 'Str0', 'Uint64', 'int32', 'i4', 'uint32', 'u4', 'int16', 'i2', 'uint16', 'u2', 'int8', 'i1', 'uint8', 'u1', 'complex_', 'int0', 'uint0', 'single', 'csingle', 'singlecomplex', 'float_', 'intc', 'uintc', 'int_', 'longfloat', 'clongfloat', 'longcomplex', 'bool_', 'bytes_', 'string_', 'str_', 'unicode_', 'object_', 'int', 'float', 'complex', 'bool', 'object', 'str', 'bytes', 'a'])

6. dtype 类的属性

dtype 类有很多有用的属性。

t = np.dtype("float64")
  • char 属性获取数据类型的字符编码:
t.char

'd'
  • type 属性获取数据元素的数据类型:
t.type

numpy.float64
  • str 属性获取数据类型的字符串表示:
  • 该字符串的首字符表示字节序(endianness),后面如果还有字符的话,将是一个字符编码,接着一个数字表示每个数组元素存储所需的字节数。
  • 字节序:指位长为 32 或 64 的字(word)存储的顺序,包括大端序(big-endian)和小端序(little-endian)。
  • 大端序(big-endian):将最高位字节存储在最低的内存地址处,用 > 表示。
  • 小端序(little-endian):将最低位字节存储在最低的内存地址处,用 < 表示。
t.str

'<f8'
  • timesize 属性获取单个数组元素在内存中占用的字节数
t.itemsize

8

三、创建自定义数据类型

自定义数据类型是一种异构数据类型,可以当做用来记录电子表格或数据库中一行数据的结构。

题目:创建一个存储京东商店商品库存信息的数据类型。

      a. 商品名称字段:用一个长度为 40 个字符的字符串来记录商品名称;

      b. 商品库存数量字段:用一个 32 位的整数来记录商品的库存数量;

      c. 商品价格字段:用一个 32 位的单精度浮点数来记录商品价格。

(1) 创建数据类型

t = np.dtype([("name", "str_4", 40), ("numitems", "int32"), ("price", "float32")])
print(t)
dtype([('name', '<U40'), ('numitems', '<i4'), ('price', '<f4')])

(2) 查看数据类型(也可以查看某一字段的数据类型)

t["name"]

dtype('<U40')
t["numitems"]

dtype('int32')
t["price"]

dtype('float32')

(3) 创建自定义数据类型的数组)

data = np.array([('迈克尔杰克逊绝版 DVD', 1, 20000.0),("杰克琼斯外套", 53, 980.05),("苹果12", 24, 8675.72)],dtype=t)

print(data)
print(type(data))
print(data.dtype)
[('迈克尔杰克逊绝版 DVD',  1, 20000.  ) (以上是关于NumPy 基础的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb SSM酒店信息管理系统(源码+sql直接运行《精品毕设》)主要功能:登录注册酒店信息浏览搜索酒店信息查看房间预定房间后台主要功能:部门/房间/楼层/入住/用户/员工/预定等

基于Java SSM酒店信息管理系统(《精品毕设》源码+sql直接运行)主要功能:登录注册酒店信息浏览搜索酒店信息查看房间预定房间后台主要功能:部门/房间/楼层/入住/用户/员工/预定等

CesiumLab V1.4 分类3dtiles生成(倾斜单体化楼层房间交互)

C#开发BIMFACE系列24 服务端API之获取模型数据9:获取单个房间信息

sql 从房间号中或从含有几个"-"间隔的字符串中,截取楼层数,或截取第几个"-"后的前几个字符或数字

如何获取核心数据中关系的关系?