NumPy的核心是ndarray对象,即多维数组。掌握创建数组的各种方法是使用NumPy的第一步。本节将详细介绍从简单列表到专业函数的所有创建方式。
np.array() 从Python列表创建最直接的方式是从Python列表或元组创建NumPy数组:
import numpy as np
# 一维数组
arr1 = np.array([1, 2, 3, 4, 5])
print("一维数组:", arr1)
# 二维数组(列表的列表)
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print("二维数组:\n", arr2)
# 指定数据类型
arr3 = np.array([1, 2, 3], dtype=float)
print("指定float类型:", arr3)
输出:
一维数组: [1 2 3 4 5]
二维数组:
[[1 2 3]
[4 5 6]]
指定float类型: [1. 2. 3.]
np.arange() 创建等差数组
arange类似于Python内置的range,但返回的是NumPy数组:
# 0到9
a = np.arange(10)
print("arange(10):", a)
# 从2到9
b = np.arange(2, 10)
print("arange(2, 10):", b)
# 步长为2
c = np.arange(2, 10, 2)
print("arange(2, 10, 2):", c)
输出:
arange(10): [0 1 2 3 4 5 6 7 8 9]
arange(2, 10): [2 3 4 5 6 7 8 9]
arange(2, 10, 2): [2 4 6 8]
np.linspace() 创建等间隔数组
linspace在指定的区间内返回固定数量的等间隔样本:
# 0到10之间等间隔取5个数
d = np.linspace(0, 10, 5)
print("linspace(0, 10, 5):", d)
# 不包含终点(endpoint=False)
e = np.linspace(0, 10, 5, endpoint=False)
print("linspace(0, 10, 5, endpoint=False):", e)
输出:
linspace(0, 10, 5): [ 0. 2.5 5. 7.5 10. ]
linspace(0, 10, 5, endpoint=False): [0. 2. 4. 6. 8.]
使用zeros、ones、full可以快速创建填充固定值的数组:
# 3行4列的全零数组
zeros_arr = np.zeros((3, 4))
print("zeros((3,4)):\n", zeros_arr)
# 2x2x3的全一数组
ones_arr = np.ones((2, 2, 3))
print("ones((2,2,3)):\n", ones_arr)
# 2行3列,所有值为5.5
full_arr = np.full((2, 3), 5.5)
print("full((2,3), 5.5):\n", full_arr)
输出:
zeros((3,4)):
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
ones((2,2,3)):
[[[1. 1. 1.]
[1. 1. 1.]]
[[1. 1. 1.]
[1. 1. 1.]]]
full((2,3), 5.5):
[[5.5 5.5 5.5]
[5.5 5.5 5.5]]
np.eye)
eye用于创建对角线为1、其余为0的二维数组(单位矩阵):
# 3x3单位矩阵
identity = np.eye(3)
print("eye(3):\n", identity)
# 3行4列,对角线为1
identity_rect = np.eye(3, 4)
print("eye(3,4):\n", identity_rect)
# 偏移对角线(k参数)
offset = np.eye(3, k=1)
print("eye(3, k=1):\n", offset)
输出:
eye(3):
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
eye(3,4):
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]]
eye(3, k=1):
[[0. 1. 0.]
[0. 0. 1.]
[0. 0. 0.]]
NumPy的random模块提供了丰富的随机数组生成函数:
# 设置随机种子以便结果可复现
np.random.seed(42)
# 生成3x4的[0,1)均匀分布随机数
rand_arr = np.random.rand(3, 4)
print("rand(3,4):\n", rand_arr)
# 生成标准正态分布随机数
randn_arr = np.random.randn(2, 3)
print("randn(2,3):\n", randn_arr)
# 生成随机整数(0到10之间,不包括10)
randint_arr = np.random.randint(0, 10, size=(2, 5))
print("randint(0,10,(2,5)):\n", randint_arr)
# 从给定列表中随机选择
choice_arr = np.random.choice(['a', 'b', 'c'], size=5)
print("choice(['a','b','c'], size=5):", choice_arr)
输出(每次运行结果可能不同):
rand(3,4):
[[0.37454012 0.95071431 0.73199394 0.59865848]
[0.15601864 0.15599452 0.05808361 0.86617615]
[0.60111501 0.70807258 0.02058449 0.96990985]]
randn(2,3):
[[-0.012664 0.437174 -0.568066]
[-0.264029 -0.703358 0.475407]]
randint(0,10,(2,5)):
[[6 9 6 1 0]
[1 9 2 8 7]]
choice(['a','b','c'], size=5): ['c' 'a' 'b' 'a' 'c']
可以使用np.asarray将现有类数组对象转换为ndarray,或使用np.copy显式复制:
original = np.array([1, 2, 3])
# asarray:如果输入已经是ndarray,则不复制(节省内存)
as_arr = np.asarray(original)
print("asarray 是否共享内存?", np.may_share_memory(original, as_arr)) # True
# copy:总是创建新副本
copied = np.copy(original)
print("copy 是否共享内存?", np.may_share_memory(original, copied)) # False
输出:
asarray 是否共享内存? True
copy 是否共享内存? False
empty函数分配内存但不对其进行初始化,因此内容可能是随机的(效率高):
empty_arr = np.empty((2, 3))
print("empty((2,3)):\n", empty_arr)
输出(内容不确定):
empty((2,3)):
[[0. 0. 0.]
[0. 0. 0.]] # 实际可能显示垃圾值
有时我们先创建一维数组,再通过reshape改变为所需形状:
# 创建0到11的一维数组
arr = np.arange(12)
print("原数组:", arr)
# 重塑为3行4列
reshaped = arr.reshape(3, 4)
print("reshape(3,4):\n", reshaped)
# 重塑为2行2列3层(三维)
reshaped_3d = arr.reshape(2, 2, 3)
print("reshape(2,2,3):\n", reshaped_3d)
输出:
原数组: [ 0 1 2 3 4 5 6 7 8 9 10 11]
reshape(3,4):
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
reshape(2,2,3):
[[[ 0 1 2]
[ 3 4 5]]
[[ 6 7 8]
[ 9 10 11]]]
reshape时,新形状的元素总数必须与原数组一致。可以使用-1自动推断某一维度。
本节介绍了创建NumPy数组的多种方法,从基本的array函数到专门的全零、全一、等差、随机数组。掌握这些创建方式,你就可以轻松构建所需的数据结构,为后续的数组操作打下坚实基础。接下来,我们将学习如何访问和修改数组中的元素——数组索引与切片。