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 支持的数据类型

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.  ) ('杰克琼斯外套', 53,   980.05) ('苹果12', 24以上是关于NumPy 基础的主要内容,如果未能解决你的问题,请参考以下文章

numpy基础入门

numpy基础代码操练

Numpy学习:《Python数据分析基础教程NumPy学习指南第2版》中文PDF+英文PDF+代码

numpy基础入门

[vscode]--HTML代码片段(基础版,reactvuejquery)

python numpy 基础教程