1. NumPy中的数组
在Python中,我们可以使用列表来表示向量或矩阵,但是对于数据科学中的高性能计算,NumPy提供了更为灵活、高效的数组类型。在NumPy中的数组(ndarray)是一个可变且类型固定的多维数组结构。
1.1 创建数组
NumPy提供了多种方式来创建数组,比如使用numpy.array()函数:
import numpy as np
a = np.array([1, 2, 3])
print(a) # [1 2 3]
还可以使用numpy.zeros()或numpy.ones()函数来创建指定形状的数组,这些函数接受一个形状元组参数,表示数组中每个维度的大小:
b = np.zeros((2, 3)) # 2行3列的全零矩阵
print(b)
# [[0. 0. 0.]
# [0. 0. 0.]]
c = np.ones((2, 4)) # 2行4列的全1矩阵
print(c)
# [[1. 1. 1. 1.]
# [1. 1. 1. 1.]]
另外,也可以使用numpy.arange()函数来创建一维数组:
d = np.arange(6)
print(d) # [0 1 2 3 4 5]
1.2 数组属性
NumPy中的数组有一些常用的属性,如shape、dtype、size等。
shape:表示数组的形状,即每个维度的大小。
dtype:表示数组元素的类型,如float、int、bool等。
size:表示数组中元素的总个数,即数组的大小。
我们可以使用这些属性来查看数组的信息:
a = np.array([[1, 2, 3], [4, 5, 6]])
print("shape:", a.shape) # (2, 3)
print("dtype:", a.dtype) # int32
print("size:", a.size) # 6
2. 数组的操作
2.1 索引和切片
NumPy中的数组可以像Python中的列表一样,使用索引和切片来访问和修改数组。
要访问数组中的单个元素,可以使用方括号及逗号分隔的索引,如下:
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a[0, 1]) # 2
要访问数组中的一行或一列,可以使用切片语法:
print(a[0, :]) # [1 2 3]
print(a[:, 1]) # [2 5]
此外,数组的元素可以通过索引或切片来修改:
a[1, 2] = 7
print(a)
# [[1 2 3]
# [4 5 7]]
2.2 数组的运算
NumPy中的数组可以进行各种数学运算,如加、减、乘、除等。
对于两个形状相同的数组,它们之间的运算会逐个元素地进行:
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
print(a + b)
# [[ 6 8]
# [10 12]]
print(a * b)
# [[ 5 12]
# [21 32]]
对于不同形状的数组,可以使用广播(Broadcasting)机制来进行运算:
a = np.array([[1, 2], [3, 4]])
b = np.array([10, 20])
print(a + b)
# [[11 22]
# [13 24]]
c = np.array([1, 2])
print(a * c.reshape(2, 1))
# [[1 2]
# [6 8]]
3. 数组的高级操作
3.1 矩阵的乘法
在NumPy中,可以使用numpy.dot()函数或者@符号来进行矩阵乘法,此外,使用numpy.matmul()函数也可以实现类似的功能。
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
print(np.dot(a, b))
# [[19 22]
# [43 50]]
print(a @ b)
# [[19 22]
# [43 50]]
print(np.matmul(a, b))
# [[19 22]
# [43 50]]
3.2 数组的变形
使用numpy.reshape()函数可以改变数组的形状,同时保持数组元素不变。比如,将一个形状为(2, 3)的数组变成形状为(3, 2)的数组:
a = np.array([[1, 2, 3], [4, 5, 6]])
b = a.reshape(3, 2)
print(b)
# [[1 2]
# [3 4]
# [5 6]]
另外,如果想要将数组扁平化(即变成一维数组),可以使用numpy.flatten()或numpy.ravel()函数:
a = np.array([[1, 2, 3], [4, 5, 6]])
b = a.flatten()
c = a.ravel()
print(b) # [1 2 3 4 5 6]
print(c) # [1 2 3 4 5 6]
3.3 数组的拼接和分裂
NumPy提供了多种方式来对数组进行拼接操作,如numpy.concatenate()、numpy.vstack()、numpy.hstack()等。
比如,在对两个形状相同的数组进行拼接时(假设都为二维数组),我们可以使用numpy.concatenate()函数,需要指定拼接方向axis:
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
c = np.concatenate((a, b), axis=0)
print(c)
# [[1 2]
# [3 4]
# [5 6]
# [7 8]]
对于不同维度的数组拼接操作,比如对两个行向量进行拼接,可以使用numpy.vstack()函数。
在对数组进行分裂操作时,可以使用numpy.split()、numpy.vsplit()、numpy.hsplit()等函数。比如,将一个形状为(4, 4)的数组分裂成两个形状为(2, 4)的数组:
a = np.arange(16).reshape(4, 4)
b, c = np.split(a, 2, axis=0)
print(b)
# [[0 1 2 3]
# [4 5 6 7]]
print(c)
# [[ 8 9 10 11]
# [12 13 14 15]]
4. 总结
本文介绍了Python中数组的使用,包括NumPy中ndarray数组的创建、属性、操作等。通过本文的学习,读者可以掌握数组的基本操作,并且可以使用数组来进行高性能的数学计算,比如矩阵乘法、数组的分裂和拼接等。