数组创建
数组创建
创建 NumPy 数组 ndarray
的不同方法。
一、序列转换
可以使用 Python 的列表或者元组来定义,将序列作为 np.array()
的参数即可获得 NumPy 数组。在 NumPy 中的数组可以称为 ndarray。
a1 = np.array([1, 2, 3, 4])
print(f'a1 is: {a1}')
a2 = np.array([[1, 2], [3, 4]])
print(f'a2 is: {a2}')
a3 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(f'a3 is: {a3}')
a1 is: [1 2 3 4]
a2 is: [[1 2]
[3 4]]
a3 is: [[[1 2]
[3 4]]
[[5 6]
[7 8]]]
数组的属性
NumPy 的数组具有多个重要属性:
- 维度:arr.ndim属性,表示数组的维度。
- 形状:arr.shape属性,表示数组的维度大小,以元组形式呈现。
- 大小:arr.size属性,表示数组中元素的总数。
- 数据类型:arr.dtype属性,表示数组中元素的数据类型。
arr = np.array([[1, 2], [3, 4]])
print(arr.ndim)
print(arr.shape)
print(arr.size)
print(arr.dtype)
2
(2, 2)
4
int64
指定数据类型
使用 numpy.array
定义新数组时,可以指定数组中元素的类型 dtype
。
np.array([1, 2, 3, 4], dtype=np.int8)
当传入的数据不符合 dtype
时,可能会得到意想不到的问题。
int8 的范围是 (-128, 127)
arr = np.array([128,2,3], dtype=np.int8)
print(arr)
因为长度溢出,所以128变成了-128
[-128 2 3]
二、内部创建
NumPy 内部提供了多种创建数组的函数
一维数组
numpy.arange
创建一个包含在给定区间内均匀间隔的值的数组。
numpy.arange([start, ]stop, [step, ]dtype=None)
start (可选): 数组中第一个值,默认值为0。
stop: 数组中最后一个值(不包括在内)。
step (可选): 值之间的间隔,默认值为1。
dtype (可选): 输出数组的类型,如果没有指定,将根据其他参数的类型来推断。
- 生成一个从0到9的数组
arr1 = np.arange(10)
print(arr1)
[0 1 2 3 4 5 6 7 8 9]
- 生成一个从1到9的数组,步长为2
arr2 = np.arange(1, 10, 2)
print(arr2)
[1 3 5 7 9]
- 生成一个从0到1的浮点数组,步长为0.1
arr3 = np.arange(0, 1, 0.1)
print(arr3)
[0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
numpy.linspace
在指定的间隔内返回均匀间隔的数字。与 numpy.arange
不同的是,numpy.linspace
通过指定样本数量,而不是步长,来生成数组。
适合用于绘图时生成坐标轴的值等场景。
numpy.linspace(start, stop, num=50, endpoint=True)
start: 序列的起始值。
stop: 序列的结束值。
num (可选): 要生成的样本数,默认值为50。
endpoint (可选): 如果为 True
,则包含 stop
值,默认为 True
。
- 生成一个从0到1的数组,包含10个数
arr = np.linspace(0, 1, 10)
print(arr)
[0. 0.11111111 0.22222222 0.33333333 0.44444444 0.55555556 0.66666667 0.77777778 0.88888889 1. ]
- 生成一个从0到1的数组,包含5个数,不包括结束值
arr = np.linspace(0, 1, 5, endpoint=False)
print(arr)
[0. 0.2 0.4 0.6 0.8]
二维数组
np.eye
用于创建单位矩阵,对角线元素为1,其余元素为0的二维数组。
numpy.eye(N, M=None, k=0, dtype=<class 'float'>, order='C')
N: 输出矩阵的行数。
M (可选): 输出矩阵的列数。如果未提供,则默认为 N
。
k (可选): 对角线的索引。默认为0,表示主对角线。正值表示上方的对角线,负值表示下方的对角线。
dtype (可选): 输出数组的数据类型,默认值为 float
。
order (可选): 存储多维数据的顺序。'C'
表示行优先(C风格),'F'
表示列优先(Fortran风格)。
- 生成一个3x3的单位矩阵
arr = np.eye(3)
print(arr)
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
- 生成一个3x3的矩阵,主对角线在上移1位
arr = np.eye(3, k=1)
print(arr)
[[0. 1. 0.]
[0. 0. 1.]
[0. 0. 0.]]
numpy.diag
用于创建对角矩阵。或者如果给定二维数组,则返回仅包含对角线元素的一维数组。
numpy.diag(v, k=0)
v: 输入数据。可以是一个一维或二维数组。
k (可选): 对角线的索引。默认值为0,表示主对角线。正值表示上方的对角线,负值表示下方的对角线。
- 从一维数组创建一个对角矩阵
arr = np.diag([1, 2, 3])
print(arr)
[[1 0 0]
[0 2 0]
[0 0 3]]
- 从二维数组中提取主对角线
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
diag = np.diag(arr)
print(diag)
[1 5 9]
ndarrays
通过指定元组或列表中的维度数和该维度的长度来创建具有任意维度的数组。
np.zeros
创建一个包含所有元素为零的数组
numpy.zeros(shape, dtype=float, order='C')
shape: 用于定义输出数组的形状。可以是一个整数或一个整数元组。
dtype (可选): 输出数组的数据类型。默认值为 float
。
order (可选): 存储多维数据的顺序。'C'
表示行优先(C风格),'F'
表示列优先(Fortran风格)。
- 生成一个二维数组,形状为3x4,所有元素为0
arr = np.zeros((3, 4))
print(arr)
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
np.ones
np.ones与np.zeros类似,只不过内容都是1。
np.indices
创建一个表示网格索引的数组。它返回一个包含N维索引数组的元组,每个数组的形状都是给定维度.
numpy.indices(dimensions, dtype=int, sparse=False)
dimensions: 一个整数元组,指定每个维度的大小。
dtype (可选): 输出数组的数据类型,默认值为 int
。
sparse (可选): 如果为 True
,返回稀疏矩阵。如果为 False
,返回密集矩阵。默认值为 False
。
- 生成一个形状为(3, 3)的二维网格索引
indices = np.indices((3, 3))
print(indices)
[[[0 0 0]
[1 1 1]
[2 2 2]]
[[0 1 2]
[0 1 2]
[0 1 2]]]
第一个数组表示行索引,第二个数组表示列索引。
三、数组的拷贝
通过 NumPy 中的 copy
函数可以对原数组进行拷贝。
a = np.array([1, 2, 3, 4])
b = a.copy()
b += 1
print('a = ', a)
print('b = ', b)
a = [1 2 3 4]
b = [2 3 4 5]
可以看到对 b
数组的修改并不会影响 a
数组。