Python 中的数组

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数组的创建、属性、操作等。通过本文的学习,读者可以掌握数组的基本操作,并且可以使用数组来进行高性能的数学计算,比如矩阵乘法、数组的分裂和拼接等。

后端开发标签