创建 NumPy 数组

NumPy的核心是ndarray对象,即多维数组。掌握创建数组的各种方法是使用NumPy的第一步。本节将详细介绍从简单列表到专业函数的所有创建方式。

1. 使用 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.]

2. 使用 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]

3. 使用 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.]

4. 创建全零、全一或指定值的数组

使用zerosonesfull可以快速创建填充固定值的数组:

# 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]]

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.]]

6. 使用随机数生成数组

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']

7. 从已有数组创建新数组

可以使用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

8. 创建空数组

empty函数分配内存但不对其进行初始化,因此内容可能是随机的(效率高):

empty_arr = np.empty((2, 3))
print("empty((2,3)):\n", empty_arr)

输出(内容不确定):

empty((2,3)):
 [[0. 0. 0.]
 [0. 0. 0.]]   # 实际可能显示垃圾值

9. 创建多维数组并调整形状

有时我们先创建一维数组,再通过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函数到专门的全零、全一、等差、随机数组。掌握这些创建方式,你就可以轻松构建所需的数据结构,为后续的数组操作打下坚实基础。接下来,我们将学习如何访问和修改数组中的元素——数组索引与切片