基础
概念
1.NumPy 的全称是“ Numeric Python”,它是 Python 的第三方扩展包,主要用来计算、处理一维或多维数组
2.在数组算术计算方面, NumPy 提供了大量的数学函数
3.NumPy 的底层主要用 C语言编写,因此它能够高速地执行数值计算
4.NumPy 还提供了多种数据结构,这些数据结构能够非常契合的应用在数组和矩阵的运算上
优点
NumPy 可以很便捷高效地处理大量数据,使用 NumPy 做数据处理的优点如下:
- NumPy 是 Python 科学计算基础库
- NumPy 可以对数组进行高效的数学运算
- NumPy 的 ndarray 对象可以用来构建多维数组
- NumPy 能够执行傅立叶变换与重塑多维数组形状
- NumPy 提供了线性代数,以及随机数生成的内置函数
与python列表区别
1.NumPy 数组是同质数据类型(homogeneous),即数组中的所有元素必须是相同的数据类型。数据类型在创建数组时指定,并且数组中的所有元素都必须是该类型。
2.Python 列表是异质数据类型(heterogeneous),即列表中的元素可以是不同的数据类型。列表可以包含整数、浮点数、字符串、对象等各种类型的数据。
3.NumPy 数组提供了丰富的数学函数和操作,如矩阵运算、线性代数、傅里叶变换等。
4.Python 列表提供了基本的列表操作,如添加、删除、切片、排序等。
安装
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple/
ndarray
1.NumPy 定义了一个 n 维数组对象,简称 ndarray 对象,它是一个一系列相同类型元素组成的数组集合。数组中的每个元素都占有大小相同的内存块,您可以使用索引或切片的方式获取数组中的每个元素。
2.ndarray 对象采用了数组的索引机制,将数组中的每个元素映射到内存块上,并且按照一定的布局对内存块进行排列,常用的布局方式有两种,即按行或者按列。
2.主要特点
- 多维数组:ndarray 可以表示任意维度的数组,包括一维、二维、三维等。
- 同质数据类型:ndarray 中的所有元素必须是相同的数据类型。
- 高效内存布局:ndarray 在内存中是连续存储的,这使得数组的访问和操作非常高效。
- 丰富的功能和方法:ndarray 提供了丰富的数学函数和操作,如矩阵运算、线性代数、傅里叶变换等。
3.使用方式
- ndarray 是通过 array 函数或其他 NumPy 函数(如 zeros、ones、arange 等)创建的。
- array 函数接受一个序列作为输入,并返回一个 ndarray 对象。
array创建对象
1.通过 NumPy 的内置函数 array() 可以创建 ndarray 对象,其语法格式如下:
numpy.array(object, dtype = None, copy = True, order = None,ndmin = 0)
2.参数说明
序号 | 参数 | 描述说明 |
---|---|---|
1 | object | 表示一个数组序列 |
2 | dtype | 可选参数,通过它可以更改数组的数据类型 |
3 | copy | 可选参数,表示数组能否被复制,默认是 True |
4 | order | 以哪种内存布局创建数组,有 3 个可选值,分别是 C(行序列)/F(列序列)/A(默认) |
5 | ndmin | 用于指定数组的维度 |
3.例
#改变数组的形状,比如:将1维数组修改未2未数组,修改后数组元素的个数和原数组相同
def np_reshape():
arr = np.array([1,2,3,4,5,6])
#reshape修改数组的形状,例如:(2,3)表示两行三列,修改后会返回一个新数组,不会修改元素组的维度
#order:指定数据存储顺序,C:按行村,F:按列存
"""
[[1 3 5]
[2 4 6]]
"""
# shaped_arr = arr.reshape((2,3),order='F')
"""
[[1 2 3]
[4 5 6]]
"""
shaped_arr = arr.reshape((2,3),order='C')
# shaped_arr = arr.reshape((2,4),order='C') 报错数组的元素个数不相同
print(shaped_arr)
print(shaped_arr.shape)#(2, 3)
arr2 = arr.reshape((1,2,3))
"""
[[[1 2 3]
[4 5 6]]]
"""
print(arr2)
print(arr2.shape) #(1, 2, 3)
#直接在原数组上修改形状,不是返回一个新数组
"""
[[1 2 3]
[4 5 6]]
"""
arr.shape = (2,3)
print(arr)
#定义main方法,并运行np_array
if __name__ == '__main__':
np_array()
reshape数组变维
1.reshape() 函数允许你在不改变数组数据的情况下,改变数组的维度。
2.reshape() 返回的是一个新的数组,原数组不会被修改。reshape() 可以用于多维数组,例如将一个一维数组重塑为二维数组。
3.元素总数必须匹配:新形状中的元素总数必须与原数组中的元素总数相同。
- 例如,一个长度为6的一维数组可以被重塑为 (2, 3) 或 (3, 2),但不能被重塑为 (2, 2)。
4.案例
#改变数组的形状,比如:将1维数组修改未2未数组,修改后数组元素的个数和原数组相同
def np_reshape():
arr = np.array([1,2,3,4,5,6])
#reshape修改数组的形状,例如:(2,3)表示两行三列,修改后会返回一个新数组,不会修改元素组的维度
#order:指定数据存储顺序,C:按行村,F:按列存
"""
[[1 3 5]
[2 4 6]]
"""
# shaped_arr = arr.reshape((2,3),order='F')
"""
[[1 2 3]
[4 5 6]]
"""
shaped_arr = arr.reshape((2,3),order='C')
print(shaped_arr)
print(shaped_arr.shape)#(2, 3)
arr2 = arr.reshape((1,2,3))
"""
[[[1 2 3]
[4 5 6]]]
"""
print(arr2)
print(arr2.shape) #(1, 2, 3)
#直接在原数组上修改形状,不是返回一个新数组
"""
[[1 2 3]
[4 5 6]]
"""
arr.shape = (2,3)
print(arr)
#定义main方法,并运行np_array
if __name__ == '__main__':
np_reshape()
5.-1 作为占位符:你可以使用 -1 作为占位符,让 numpy 自动计算某个维度的大小。
def np_reshape():
arr = np.array([1,2,3,4,5,6])
#-1占位符,自动计算列数
arr2 = arr.reshape(2,-1)
"""
[[1 2 3]
[4 5 6]]
"""
print(arr2)
#定义main方法,并运行np_array
if __name__ == '__main__':
np_reshape()
数据类型
1.NumPy 提供了比 Python 更加丰富的数据类型,如下所示
序号 | 数据类型 | 语言描述 |
---|---|---|
1 | bool_ | 布尔型数据类型(True 或者 False) |
2 | int_ | 默认整数类型,类似于 C 语言中的 long,取值为 int32 或 int64 |
3 | intc | 和 C 语言的 int 类型一样,一般是 int32 或 int 64 |
4 | intp | 用于索引的整数类型(类似于 C 的 ssize_t,通常为 int32 或 int64) |
5 | int8 | 代表与1字节相同的8位整数。值的范围是-128到127 |
6 | int16 | 代表 2 字节(16位)的整数。范围是-32768至32767 |
7 | int32 | 代表 4 字节(32位)整数。范围是-2147483648至2147483647 |
8 | int64 | 表示 8 字节(64位)整数。范围是-9223372036854775808至9223372036854775807 |
9 | uint8 | 1字节(8位)无符号整数 |
10 | uint16 | 2 字节(16位)无符号整数 |
11 | uint32 | 4 字节(32位)无符号整数 |
12 | uint64 | 8 字节(64位)无符号整数 |
13 | float_ | float64 类型的简写 |
14 | float16 | 半精度浮点数,包括:1 个符号位,5 个指数位,10个尾数位 |
15 | float32 | 单精度浮点数,包括:1 个符号位,8 个指数位,23个尾数位 |
16 | float64 | 双精度浮点数,包括:1 个符号位,11 个指数位,52个尾数位 |
17 | complex_ | 复数类型,与 complex128 类型相同 |
18 | complex64 | 表示实部和虚部共享 32 位的复数 |
19 | complex128 | 表示实部和虚部共享 64 位的复数 |
20 | str_ | 表示字符串类型 |
21 | string_ | 表示字节串类型 |
数据类型对象
1.数据类型对象(Data Type Object)又称 dtype 对象,是用来描述与数组对应的内存区域如何使用。
2.可以在创建数组时指定 dtype 参数来定义数组中元素的数据类型。
import numpy as np
# 创建一个 int32 类型的数组
arr_int = np.array([1, 2, 3], dtype=np.int32)
print(arr_int.dtype) # 输出: int32
# 创建一个 float64 类型的数组
arr_float = np.array([1.0, 2.0, 3.0], dtype=np.float64)
print(arr_float.dtype) # 输出: float64
2.可以使用数组的 dtype 属性来获取数组中元素的数据类型。
arr = np.array([1, 2, 3])
print(arr.dtype) # 输出: int32
3.可以使用 astype() 方法来转换数组中元素的数据类型。
arr = np.array([1, 2, 3])
arr_float = arr.astype(np.float64)
print(arr_float.dtype) # 输出: float64
数据类型标识码
1.NumPy 中每种数据类型都有一个唯一标识的字符码,int8, int16, int32, int64 四种数据类型可以使用字符串 'i1', 'i2','i4','i8' 代替,如下所示:
字符 | 对应类型 |
---|---|
b | 代表布尔型 |
i | 带符号整型 |
u | 无符号整型 |
f | 浮点型 |
c | 复数浮点型 |
m | 时间间隔(timedelta) |
M | datatime(日期时间) |
O | Python对象 |
S,a | 字节串(S)与字符串(a) |
U | Unicode |
V | 原始数据(void) |
2.以下是 NumPy 中常见的数据类型标识码及其对应的详细列表
(1)整数类型
数据类型 | 标识码 | 描述 |
---|---|---|
int8 | i1 | 8 位有符号整数 |
int16 | i2 | 16 位有符号整数 |
int32 | i4 | 32 位有符号整数 |
int64 | i8 | 64 位有符号整数 |
uint8 | u1 | 8 位无符号整数 |
uint16 | u2 | 16 位无符号整数 |
uint32 | u4 | 32 位无符号整数 |
uint64 | u8 | 64 位无符号整数 |
(2)浮点数类型
数据类型 | 标识码 | 描述 |
---|---|---|
float16 | f2 | 16 位浮点数(半精度) |
float32 | f4 | 32 位浮点数(单精度) |
float64 | f8 | 64 位浮点数(双精度) |
(3)复数类型
数据类型 | 标识码 | 描述 |
---|---|---|
complex64 | c8 | 64 位复数(单精度) |
complex128 | c16 | 128 位复数(双精度) |
(4)布尔类型
数据类型 | 标识码 | 描述 |
---|---|---|
bool | b1 | 布尔类型 |
(5)字符串类型
数据类型 | 标识码 | 描述 |
---|---|---|
S | S10 | 长度为 10 的字节串 |
U | U10 | 长度为 10 的 Unicode 字符串 |
(6)Python 对象类型
数据类型 | 标识码 | 描述 |
---|---|---|
O | O | Python 对象类型 |
3.自定义一个int32的数据类型
dt=np.dtype('i4')
data = np.array([1,2,3,4],dtype=dt)
print(data) #输出:[1 2 3 4]
print(data.dtype) #输出:int32
#改变数组的形状,比如:将1维数组修改未2未数组,修改后数组元素的个数和原数组相同
def data_type():
arr = np.array([1,2,3,4],dtype=np.int16)
print(arr) # [1 2 3 4]
print(arr.dtype) #int16
#数据类型识别码,和numpy中的数据类型一一对应,例如:i1对应np.int8,f2对于np.float16
arr1 = np.array([5,6,7,8],dtype='i2')
print(arr.dtype) #int16
4.可以自定义复杂的数据结构
dt=np.dtype([('name','S10'),('age','i4')])
data = np.array([('zhangsan',20),('lisi',21)],dtype=dt)
print(data) #输出:[(b'zhangsan&