NumPy Ndarray对象:创建与使用指南

NumPy(Numerical Python)是Python科学计算的核心库,其核心数据结构是Ndarray(N-dimensional array,多维数组)​。Ndarray是一种同质、多维的数组对象,所有元素类型相同,支持高效的向量化运算(无需显式循环),是数据处理、机器学习等领域的基础工具。

图片[1]_NumPy Ndarray对象:创建与使用指南_知途无界

一、Ndarray的核心特性

  • 同质性​:所有元素必须是同一数据类型(如intfloatstr等),由dtype属性指定。
  • 多维性​:支持1维(向量)、2维(矩阵)、3维(张量)及更高维度。
  • 固定大小​:创建后形状(shape)不可变(但可通过reshape调整视图,或通过resize修改原数组)。
  • 高效运算​:基于C语言实现,支持广播(Broadcasting)和向量化操作,运算速度远超Python列表。

二、Ndarray的创建方法

Ndarray的创建方式多样,可根据数据来源(如列表、文件、随机数等)选择合适的方法。

1. 从Python序列(列表/元组)创建:np.array()

最基础的创建方式,通过numpy.array()将Python列表或元组转换为Ndarray。

语法​:

import numpy as np
arr = np.array(sequence, dtype=None)  # sequence:列表/元组;dtype:可选,指定数据类型

示例​:

# 1维数组(向量)
arr1 = np.array([1, 2, 3, 4])  # dtype默认推断为int64(或int32,取决于系统)
print(arr1)  # [1 2 3 4]
print(arr1.dtype)  # int64

# 2维数组(矩阵)
arr2 = np.array([[1, 2], [3, 4], [5, 6]])  # 嵌套列表表示二维
print(arr2)
# [[1 2]
#  [3 4]
#  [5 6]]
print(arr2.shape)  # (3, 2):3行2列

# 指定数据类型(如float)
arr3 = np.array([1, 2, 3], dtype=np.float32)
print(arr3)  # [1. 2. 3.]
print(arr3.dtype)  # float32

2. 创建特殊数组(内置函数)

NumPy提供了快速创建特定数组的函数,适用于初始化或占位场景。

函数功能描述
np.zeros(shape)创建全0数组,shape为元组(如(2,3)表示2行3列)。
np.ones(shape)创建全1数组。
np.empty(shape)创建未初始化的随机值数组(速度快,但值为内存残留,慎用)。
np.full(shape, val)创建全val值的数组(如np.full((2,2), 5)生成2×2的全5数组)。
np.arange(start, stop, step)类似Python的range,生成等差数组(左闭右开)。
np.linspace(start, stop, num)生成num个等间隔的数(包含stop,常用于绘图)。
np.eye(n)创建n×n单位矩阵(对角线为1,其余为0)。
np.random模块生成随机数组(如np.random.rand(n)均匀分布,np.random.randn(n)正态分布)。

示例​:

# 全0数组
zeros_arr = np.zeros((2, 3))  # shape=(2,3)
print(zeros_arr)
# [[0. 0. 0.]
#  [0. 0. 0.]]

# 等差数组(arange)
arange_arr = np.arange(0, 10, 2)  # start=0, stop=10(不包含), step=2
print(arange_arr)  # [0 2 4 6 8]

# 等间隔数组(linspace)
linspace_arr = np.linspace(0, 1, 5)  # 0到1之间均匀取5个数(包含1)
print(linspace_arr)  # [0.   0.25 0.5  0.75 1.  ]

# 单位矩阵
eye_arr = np.eye(3)  # 3x3单位矩阵
print(eye_arr)
# [[1. 0. 0.]
#  [0. 1. 0.]
#  [0. 0. 1.]]

# 随机数组(均匀分布[0,1))
rand_arr = np.random.rand(2, 2)  # 2x2随机数组
print(rand_arr)  # 示例输出:[[0.123 0.456] [0.789 0.012]]

# 随机整数数组(0-9,2x3)
randint_arr = np.random.randint(0, 10, size=(2, 3))
print(randint_arr)  # 示例输出:[[5 3 7] [2 8 1]]

3. 从文件读取:np.loadtxt()/np.genfromtxt()

若数据存储在文本文件(如CSV)中,可通过np.loadtxt()np.genfromtxt()读取为Ndarray。

示例(读取CSV)​​:
假设data.csv内容为:

1,2,3
4,5,6
7,8,9
# 读取CSV(逗号分隔)
data = np.loadtxt('data.csv', delimiter=',')
print(data)
# [[1. 2. 3.]
#  [4. 5. 6.]
#  [7. 8. 9.]]

三、Ndarray的基本属性

理解Ndarray的属性是高效使用的前提,常用属性如下:

属性含义
ndim数组维度(秩),如1维数组ndim=1,2维数组ndim=2
shape数组形状,元组形式(如(3,2)表示3行2列)。
size数组总元素个数(shape各维度乘积,如(3,2)size=6)。
dtype元素数据类型(如int64float32bool_)。
itemsize每个元素的字节大小(如int64为8字节,float32为4字节)。
nbytes数组总字节数(size * itemsize)。

示例​:

arr = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.int32)
print("维度:", arr.ndim)       # 2
print("形状:", arr.shape)      # (2, 3)
print("总元素数:", arr.size)    # 6
print("数据类型:", arr.dtype)   # int32
print("单个元素字节:", arr.itemsize)  # 4(int32占4字节)
print("总字节数:", arr.nbytes)  # 24(6 * 4)

四、Ndarray的使用:索引、切片、变形与运算

1. 索引与切片(访问元素)

Ndarray的索引与切片规则类似Python列表,但支持多维操作。

  • 1维数组​:与普通列表一致(正索引、负索引、start:end:step)。
  • 多维数组​:通过逗号分隔各维度的索引(如arr[i, j]表示第i行第j列)。

示例​:

# 1维数组索引与切片
arr1 = np.array([10, 20, 30, 40, 50])
print(arr1[2])      # 30(正索引)
print(arr1[-1])     # 50(负索引,-1表示最后一个)
print(arr1[1:4])    # [20 30 40](切片,左闭右开)
print(arr1[::2])    # [10 30 50](步长2)

# 2维数组索引与切片
arr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2[1, 2])   # 6(第2行第3列,索引从0开始)
print(arr2[0:2, 1:])# 前两行,从第2列开始切片 → [[2 3] [5 6]]
print(arr2[:, ::2]) # 所有行,步长2取列 → [[1 3] [4 6] [7 9]]

2. 重塑形状(Reshaping)

通过reshape()方法调整数组形状(不改变数据,返回新视图;若无法整除则报错)。

示例​:

arr = np.arange(12)  # [0 1 2 ... 11]
reshaped = arr.reshape(3, 4)  # 转为3行4列
print(reshaped)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

# 自动计算某一维度(-1)
reshaped_auto = arr.reshape(-1, 6)  # 总元素12,-1表示自动计算行数(12/6=2)→ 2行6列
print(reshaped_auto.shape)  # (2, 6)

3. 运算(向量化操作)

Ndarray支持逐元素运算​(无需循环),且支持广播(Broadcasting)机制(不同形状数组的兼容运算)。

(1)基本算术运算(+、-、*、/、//、%)

示例​:

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

print(a + b)   # [5 7 9](对应元素相加)
print(a * 2)   # [2 4 6](标量乘法,广播)
print(a > 2)   # [False False True](布尔运算)
(2)矩阵运算(点积、转置)
  • 点积​(矩阵乘法):使用@运算符或np.dot()
  • 转置​:arr.Tnp.transpose(arr)

示例​:

# 矩阵乘法(点积)
m1 = np.array([[1, 2], [3, 4]])  # 2x2矩阵
m2 = np.array([[5, 6], [7, 8]])  # 2x2矩阵
dot_product = m1 @ m2  # 或 np.dot(m1, m2)
print(dot_product)
# [[19 22]  # (1 * 5+2 * 7, 1 * 6+2 * 8)
#  [43 50]] # (3 * 5+4 * 7, 3 * 6+4 * 8)

# 转置
print(m1.T)  # [[1 3] [2 4]]
(3)广播(Broadcasting)

当数组形状不同时,NumPy会自动扩展较小数组以匹配较大数组的形状(需满足广播规则:从尾维度开始对齐,维度相等或其中一个为1)。

示例​:

# 标量与数组广播(标量扩展为同形状数组)
arr = np.array([[1, 2], [3, 4]])
print(arr + 10)  # [[11 12] [13 14]](10扩展为[[10,10],[10,10]])

# 不同形状数组广播(行向量与矩阵)
row = np.array([1, 2])  # shape=(2,)
matrix = np.array([[3, 4], [5, 6]])  # shape=(2,2)
print(row + matrix)  # [[4 6] [6 8]](row扩展为[[1,2],[1,2]])

五、注意事项

  1. 数据类型一致性​:Ndarray所有元素类型相同,混合类型会被强制转换(如np.array([1, 2.5])dtypefloat64)。
  2. 视图与副本​:reshape()切片等操作返回原数组的视图​(共享内存,修改视图会影响原数组);copy()方法返回副本​(独立内存)。 arr = np.array([1, 2, 3]) view = arr[1:] # 视图 view[0] = 100 print(arr) # [1 100 3](原数组被修改) copy = arr.copy() # 副本 copy[0] = 200 print(arr) # [1 100 3](原数组不受影响)
  3. 性能优势​:尽量使用向量化运算(避免Python循环),充分利用NumPy的C底层优化。

总结

Ndarray是NumPy的核心,其创建方式灵活(从序列、特殊函数到文件读取),属性清晰(维度、形状、类型等),使用中需注意索引切片、重塑形状和向量化运算。掌握Ndarray是深入学习数据分析、机器学习的基础。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞5 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容