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)
1. 选取数组元素
(1) 创建一个 2 x 2 的数组
# 给 array() 函数传入一个嵌套的列表作为参数创建数组
data = np.array([[1, 2], [3, 4]])
print(data)
(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 类型 | 描述 |
---|---|
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 对象来表示数据类型。
数据类型 | 字符编码 |
---|---|
整数 | 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. ) ('杰克琼斯外套', 53, 980.05) ('苹果12', 24以上是关于NumPy 基础的主要内容,如果未能解决你的问题,请参考以下文章
Numpy学习:《Python数据分析基础教程NumPy学习指南第2版》中文PDF+英文PDF+代码