用Python进行AI数据分析进阶教程18:NumPy数组的创建
👉 欢迎订阅🔗
《用Python进行AI数据分析进阶教程》专栏
《AI大模型应用实践进阶教程》专栏
《Python编程知识集锦》专栏
《AI视频实战集锦》专栏
《智能辅助驾驶》专栏
《工具软件及IT技术集锦》专栏
关键词:NumPy数组、一维数组、二维数组、多维数组、广播机制
摘要:本文详细介绍了NumPy数组的创建方法,包括一维、二维及多维数组。首先,通过np.array()函数可轻松将Python列表或元组转换为一维或多维数组,并强调数组元素类型需一致。接着,讲解了数组的关键属性如形状(shape)、数据类型(dtype),以及数组的基本操作如向量化运算、索引与切片。还特别指出了NumPy数组与Python列表的区别,如视图与副本的概念、广播机制等。最后,总结了NumPy数组在科学计算中的重要性,为后续高级操作和实际应用打下基础。
NumPy 是 Python 中用于科学计算的核心库,其核心数据结构是 ndarray,即多维数组。以下将详细讲解如何创建一维、二维和多维数组,并指出关键点和注意点。
一、一维数组
一维数组是NumPy中最基础的数据结构,理解其关键点和注意事项对于后续学习多维数组和复杂操作至关重要。
1、关键点
(1)、创建一维数组
● 使用np.array()函数,传入Python列表或元组即可创建一维数组。
示例:
Python脚本
# 导入NumPy库并简称为np
import numpy as np
# 创建一个NumPy数组,包含整数1到4
arr = np.array([1, 2, 3, 4])
# 打印数组内容(输出: [1 2 3 4])
print(arr)
解读:
np.array()将Python列表转换为NumPy数组,数组元素类型由输入数据推断(此处为int64)。
(2)、数据类型(dtype)
● NumPy数组的元素必须是同一类型,dtype属性用于查看数组的数据类型。
示例:
Python脚本
# 导入 NumPy 库并设置别名 np
import numpy as np
# 创建一个包含整数元素的 NumPy 数组
arr = np.array([1, 2, 3, 4])
# 输出数组的数据类型,结果为 int64(64位整数类型)
print(arr.dtype) # 输出: int64
解读:
dtype显示数组的数据类型,默认为int64。可以通过dtype参数指定类型,如
np.array([1, 2, 3], dtype=float) 。
(3)、数组形状(shape)
● shape属性返回数组的维度信息。一维数组的形状为(n,),n为元素个数。
示例:
Python脚本
# 导入 NumPy 库并设置别名 np
import numpy as np
# 创建一个包含整数元素的 NumPy 数组
arr = np.array([1, 2, 3, 4])
# 输出数组的形状,当前显示为(4,),表示这是一个包含4个元素的一维数组
print(arr.shape)
解读:
(4,)表示一维数组,包含4个元素。
(4)、数组操作
● NumPy支持向量化操作,无需循环即可对数组进行数学运算。
示例:
Python脚本
# 导入NumPy库,这是Python中用于科学计算的基础库
import numpy as np
# 创建一个NumPy数组,包含四个整数元素1, 2, 3, 4
arr = np.array([1, 2, 3, 4])
# 对数组中的每个元素执行加法运算(加1)
print(arr + 1) # 输出: [2 3 4 5]
# 对数组中的每个元素执行乘法运算(乘以2)
print(arr * 2) # 输出: [2 4 6 8]
解读:
数组操作是逐元素进行的,效率高于Python列表。
2、注意点
(1)、与Python列表的区别
● NumPy数组元素类型必须一致,而Python列表可以包含不同类型的数据。
示例:
Python脚本
# 导入NumPy库,这是Python中用于科学计算的基础库
import numpy as np
# 创建一个包含整数、字符串和浮点数的Python列表
list_data = [1, "hello", 3.14]
# 使用np.array()将列表转换为NumPy数组
# NumPy要求数组中所有元素的类型一致,因此会自动将所有元素转换为字符串类型
arr = np.array(list_data)
# 输出数组内容:['1' 'hello' '3.14']
# 注意:所有元素都被转换为字符串
print(arr)
# 输出数组的数据类型:<U32
# '<U32' 表示小端字节序的Unicode字符串,最大长度为32个字符
print(arr.dtype)
解读:
NumPy将不同类型的数据统一转换为字符串类型(<U32)。
(2)、数组的视图与副本
● 切片操作返回的是原数组的视图,修改视图会影响原数组。需使用copy()方法创建副本。
示例:
Python脚本
import numpy as np # 导入NumPy库并别名为np
# 创建一个原始数组,包含四个整数元素
arr = np.array([1, 2, 3, 4])
# 创建一个视图(view),它与原数组共享内存
# view选取了原数组索引1到2的元素(左闭右开)
view = arr[1:3]
# 修改视图的第一个元素(索引0)
# 由于视图与原数组共享内存,此操作会影响原数组
view[0] = 100
# 打印原数组,验证视图修改对原数组的影响
# 输出结果应为: [1 100 3 4]
print(arr)
# 创建一个副本(copy),它拥有独立的内存空间
# 先通过切片获取视图,再调用.copy()创建独立副本
copy = arr[1:3].copy()
# 修改副本的第一个元素(索引0)
# 由于副本独立存储,此操作不会影响原数组
copy[0] = 200
# 再次打印原数组,验证副本修改对原数组无影响
# 输出结果仍为: [1 100 3 4]
print(arr)
代码解读:
● 视图部分:视图共享原数组的内存,修改视图会直接影响原数组。
● 副本部分:副本是独立的内存空间,修改副本不会影响原数组。
代码输出结果:
Plaintext
[1 100 3 4][1 100 3 4]
(3)、数组的广播机制
在进行数组运算时,NumPy会自动扩展较小数组的形状以匹配较大数组,称为广播。
示例:
Python脚本
import numpy as np # 导入 NumPy 库并简称为 np
# 创建一个一维的原始数组,包含三个整数元素
arr = np.array([1, 2, 3])
# 对数组中的每个元素执行加 1 操作,利用了 NumPy 的广播机制
# 这种操作比使用传统 Python 循环更高效
result = arr + 1
# 打印计算结果数组
print(result) # 输出结果应为: [2 3 4]
说明:
arr + 1 会对数组 arr 中的每个元素进行加 1 操作,生成一个新的数组 result。
输出结果:
Plaintext
[2 3 4]
(4)、数组的索引与切片
索引从0开始,切片语法与Python列表类似。
示例:
Python脚本
import numpy as np # 导入 NumPy 库并简写为 np
# 创建一个一维 NumPy 数组,包含整数 1 到 4
arr = np.array([1, 2, 3, 4])
# 访问并打印数组的第一个元素(索引从 0 开始)
print(arr[0]) # 输出: 1
# 打印数组的切片,返回索引 1 到 2 的元素(左闭右开区间)
print(arr[1:3]) # 输出: [2 3]
说明:
arr[0] 获取数组 arr 的第一个元素。
arr[1:3] 获取数组 arr 中从索引 1 到索引 2 的切片(不包括索引 3)。
输出结果:
Plaintext
1[2 3]
二、二维数组
二维数组是NumPy中常用的数据结构,广泛应用于矩阵运算、图像处理等领域。以下将详细讲解二维数组的关键点、注意点,并附上代码示例和解读。
1、关键点
(1)、创建二维数组
使用np.array()函数,传入嵌套列表或元组即可创建二维数组。
示例:
Python脚本
# 导入 NumPy 库
import numpy as np
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 打印整个数组
print(arr)
# 输出: [[1 2 3]
# [4 5 6]]
说明:
● np.array([[1, 2, 3], [4, 5, 6]]) 创建了一个 2 行 3 列的二维数组。
● print(arr) 输出整个数组的内容。
输出结果:
Plaintext
[[1 2 3]
[4 5 6]]
(2)、数组形状(shape)
shape属性返回数组的维度信息。二维数组的形状为(m, n),m为行数,n为列数。
示例:
Python脚本
# 打印数组的形状(行数和列数)
print(arr.shape) # 输出: (2, 3)
说明:
● arr.shape 返回数组 arr 的形状,即行数和列数。对于一个 2 行 3 列的二维数组,输出为 (2, 3)。
输出结果:
Plaintext
(2, 3)
(3)、数据类型(dtype)
NumPy数组的元素必须是同一类型,dtype属性用于查看数组的数据类型。
示例:
Python脚本
# 打印数组的数据类型
print(arr.dtype) # 输出: int64
说明:
● arr.dtype 返回数组 arr 中元素的数据类型。对于整数类型的数组,输出通常为 int64。
输出结果:
Plaintext
int64
(4)、数组操作
● NumPy支持向量化操作,无需循环即可对数组进行数学运算。
示例:
Python脚本
# 对数组中的每个元素加 1,并打印结果
print(arr + 1) # 输出: [[2 3 4]
# [5 6 7]]
# 对数组中的每个元素乘以 2,并打印结果
print(arr * 2) # 输出: [[ 2 4 6]
# [ 8 10 12]]
说明:
● arr + 1 会对数组 arr 中的每个元素进行加 1 操作。
● arr * 2 会对数组 arr 中的每个元素进行乘以 2 的操作。
输出结果:
Plaintext
[[2 3 4]
[5 6 7]]
[[ 2 4 6]
[ 8 10 12]]
(5)、索引与切片
二维数组的索引和切片语法与Python列表类似,但需要指定行和列。
示例:
Python脚本
# 打印数组中第1行第2列的元素
print(arr[0, 1]) # 输出: 2(第1行第2列)
# 打印数组中第2列所有行的元素
print(arr[:, 1]) # 输出: [2 5](第2列所有行)
说明:
● arr[0, 1] 获取数组中第1行第2列的元素。
● arr[:, 1] 获取数组中第2列所有行的元素。
输出结果:
Plaintext
2
[2 5]
2、注意点
(1)、与Python列表的区别
NumPy数组元素类型必须一致,而Python列表可以包含不同类型的数据。
示例:
Python脚本
# 创建一个包含不同类型数据的列表
list_data = [[1, "hello"], [3.14, True]]
# 将列表转换为 NumPy 数组
arr = np.array(list_data)
# 打印数组的内容
print(arr) # 输出: [['1' 'hello']
# ['3.14' 'True']]
# 打印数组的数据类型
print(arr.dtype) # 输出: <U32
说明:
● np.array(list_data) 将列表 list_data 转换为 NumPy 数组。由于列表中包含不同类型的数据(整数、字符串、浮点数、布尔值),NumPy 会统一转换为字符串类型。
● arr.dtype 返回数组的数据类型。<U32 表示数组中的元素是长度为 32 的 Unicode 字符串。
输出结果:
Plaintext
[['1' 'hello'] ['3.14' 'True']]
<U32
(2)、视图与副本
切片操作返回的是原数组的视图,修改视图会影响原数组。需使用copy()方法创建副本。
示例:
Python脚本
import numpy as np
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 创建一个视图(共享内存)
view = arr[0:1, :]
# 视图
# 修改视图的第一个元素
view[0, 0] = 100
# 打印原数组,视图修改会影响原数组
print(arr) # 输出: [[100 2 3]
# [ 4 5 6]]
# 创建一个副本(独立内存)
copy = arr[0:1, :].copy()
# 副本
# 修改副本的第一个元素
copy[0, 0] = 200
# 打印原数组,副本修改不会影响原数组
print(arr) # 输出: [[100 2 3]
# [ 4 5 6]]
说明:
● 视图:view = arr[0:1, :] 创建了一个视图,view[0, 0] = 100 修改了视图的第一个元素,由于视图共享原数组的内存,因此原数组 arr 也被修改为 [[100, 2, 3], [4, 5, 6]] 。
● 副本:copy = arr[0:1, :].copy() 创建了一个副本,copy[0, 0] = 200 修改了副本的第一个元素,但由于副本是独立的内存空间,原数组 arr 保持不变。
输出结果:
Plaintext
[[100 2 3]
[ 4 5 6]]
[[100 2 3]
[ 4 5 6]]
(3)、广播机制
在进行数组运算时,NumPy会自动扩展较小数组的形状以匹配较大数组,称为广播。
示例:
Python脚本
import numpy as np
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 将数组与另一个数组逐元素相加
result = arr + np.array([1, 2, 3])
# 打印相加后的结果
print(result) # 输出: [[2 4 6]
# [5 7 9]]
说明:
● arr + np.array([1, 2, 3]) 将二维数组 arr 与一维数组 [1, 2, 3] 逐元素相加。NumPy 的广播机制会将一维数组扩展为与二维数组匹配的形状,然后进行逐元素运算。
输出结果:
Plaintext
[[2 4 6]
[5 7 9]]
(4)、数组的变形与转置
使用reshape()方法可以改变数组的形状,T属性或transpose()方法可以转置数组。
示例:
Python脚本
import numpy as np
# 创建一个从 0 到 5 的一维数组,并将其重塑为 2 行 3 列的二维数组
arr = np.arange(6).reshape(2, 3)
# 打印原始数组
print(arr) # 输出: [[0 1 2]
# [3 4 5]]
# 打印数组的转置
print(arr.T) # 输出: [[0 3]
# [1 4]
# [2 5]]
说明:
● np.arange(6) 创建一个从 0 到 5 的一维数组。
● reshape(2, 3) 将一维数组重塑为 2 行 3 列的二维数组。
● T 返回数组的转置(行和列互换)。
输出结果:
Plaintext
[[0 1 2]
[3 4 5]]
[[0 3]
[1 4]
[2 5]]
三、多维数组
多维数组是NumPy中最重要且最常用的数据结构,广泛应用于矩阵运算、图像处理、机器学习等领域。以下将详细讲解多维数组的关键点、注意点,并附上代码示例和解读。
1、关键点
(1)创建多维数组
使用np.array()函数,传入嵌套列表或元组即可创建多维数组。
示例:
Python脚本
# 导入NumPy库
import numpy as np
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 输出二维数组
print(arr)
# 输出结果: [[1 2 3]
# [4 5 6]]
解读:
np.array()将嵌套列表转换为多维数组,数组元素类型由输入数据推断(此处为int64) 。
(2)数组形状(shape)
shape属性返回数组的维度信息。例如,二维数组的形状为(m, n),m为行数,n为列数。
示例:
Python脚本
# 输出数组的形状(行数和列数)
print(arr.shape) # 输出: (2, 3)
解读:
(2, 3)表示2行3列的二维数组 。
(3)数据类型(dtype)
NumPy数组的元素必须是同一类型,dtype属性用于查看数组的数据类型。
示例:
Python脚本
# 输出数组元素的数据类型
print(arr.dtype) # 输出: int64
解读:
dtype显示数组的数据类型,默认为int64。可以通过dtype参数指定类型,如:
np.array([[1, 2], [3, 4]], dtype=float) 。
(4)数组操作
NumPy支持向量化操作,无需循环即可对数组进行数学运算。
示例:
Python脚本
# 对数组中的每个元素加1并输出结果
print(arr + 1)
# 输出: [[2 3 4]
# [5 6 7]]
# 对数组中的每个元素乘以2并输出结果
print(arr * 2)
# 输出: [[ 2 4 6]
# [ 8 10 12]]
解读:
数组操作是逐元素进行的,效率高于Python列表 。
(5)索引与切片
多维数组的索引和切片语法与Python列表类似,但需要指定行和列。
示例:
Python脚本
# 输出数组中第1行第2列的元素
print(arr[0, 1]) # 输出: 2(第1行第2列)
# 输出数组中第2列所有行的元素
print(arr[:, 1]) # 输出: [2 5](第2列所有行)
解读:
索引从0开始,:表示选择所有行或列 。
(6)广播机制
在进行数组运算时,NumPy会自动扩展较小数组的形状以匹配较大数组,称为广播。
示例:
Python脚本
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 使用广播机制,将数组与一维数组相加
result = arr + np.array([1, 2, 3])
# 广播
# 输出相加后的结果
print(result)
# 输出: [[2 4 6]
# [5 7 9]]
解读:
np.array([1, 2, 3])被广播为与arr相同的形状。
(7)数组变形与转置
使用reshape()方法可以改变数组的形状,T属性或transpose()方法可以转置数组。
示例:
Python脚本
# 创建一个0到5的一维数组,并将其重塑为2行3列的二维数组
arr = np.arange(6).reshape(2, 3)
# 输出重塑后的二维数组
print(arr)
# 输出: [[0 1 2]
# [3 4 5]]
# 输出数组的转置
print(arr.T)
# 输出: [[0 3]
# [1 4]
# [2 5]]
解读:
reshape()要求元素总数不变,T返回数组的转置 。
2、注意点
(1)与Python列表的区别
NumPy数组元素类型必须一致,而Python列表可以包含不同类型的数据。
示例:
Python脚本
# 创建一个包含不同类型数据的列表
list_data = [[1, "hello"], [3.14, True]]
# 将列表转换为NumPy数组
arr = np.array(list_data)
# 输出转换后的数组
print(arr)
# 输出: [['1' 'hello']
# ['3.14' 'True']]
# 输出数组元素的数据类型
print(arr.dtype) # 输出: <U32
解读:NumPy将不同类型的数据统一转换为字符串类型(<U32) 。
(2)视图与副本
切片操作返回的是原数组的视图,修改视图会影响原数组。需使用copy()方法创建副本。
示例:
Python脚本
# 创建一个视图,指向数组的部分数据
view = arr[0:1, :] # 视图
# 修改视图中的数据,原数组也会被修改
view[0, 0] = 100 #
输出原数组,验证是否被修改
print(arr)
# 输出: [[100 2 3]
# [ 4 5 6]]
# 创建一个副本,独立于原数组
copy = arr[0:1, :].copy() # 副本
# 修改副本中的数据,原数组不受影响
copy[0, 0] = 200
# 输出原数组,验证是否未被修改
print(arr)
# 输出: [[100 2 3]
# [ 4 5 6]]
解读:视图共享数据,副本独立于原数组 。
(3)广播规则
广播机制需要满足一定规则,否则会引发错误。
规则:
如果两个数组的维度数不相同,小维度数组的形状会在最左边补1。
如果两个数组的形状在任何一个维度上都不匹配,且没有任何一个维度等于1,则引发错误 。
(4)数组的存储顺序
NumPy数组的存储顺序可以是行优先(C风格)或列优先(F风格),默认是行优先。
示例:
Python脚本
# 创建一个二维数组,并指定列优先(Fortran风格)的存储顺序
arr = np.array([[1, 2, 3], [4, 5, 6]], order='F')
# 查看数组的标志信息,包括存储顺序
print(arr.flags) # 查看存储顺序
解读:存储顺序影响数组的性能 。
总结
NumPy多维数组是科学计算的基础,具有高效、灵活的特点。关键点包括数组创建、形状、数据类型、操作、索引与切片、广播机制以及变形与转置,注意点包括与Python列表的区别、视图与副本、广播规则以及存储顺序。掌握这些内容将为后续学习高级操作和实际应用奠定坚实基础。
● 一维数组:通过 np.array() 将列表或元组转换为数组。
● 二维数组:通过嵌套列表创建,注意子列表长度一致。
● 多维数组:通过多层嵌套列表创建,维度顺序从外到内。
● 特殊数组:使用 np.zeros()、np.ones()、np.arange() 等函数快速创建。
通过以上方法和示例,可以灵活创建 NumPy 数组,满足科学计算和数据分析的需求。
——The END——
🔗 欢迎订阅专栏
序号 | 专栏名称 | 说明 |
---|---|---|
1 | 用Python进行AI数据分析进阶教程 | 《用Python进行AI数据分析进阶教程》专栏 |
2 | AI大模型应用实践进阶教程 | 《AI大模型应用实践进阶教程》专栏 |
3 | Python编程知识集锦 | 《Python编程知识集锦》专栏 |
4 | AI视频实战集锦 | 《AI视频实战集锦》专栏 |
5 | 智能辅助驾驶 | 《智能辅助驾驶》专栏 |
6 | 工具软件及IT技术集锦 | 《工具软件及IT技术集锦》专栏 |
👉 关注我 @理工男大辉郎 获取实时更新
欢迎关注、收藏或转发。
敬请关注 我的
微信搜索公众号:cnFuJH
CSDN博客:理工男大辉郎