NumPy是Python中一个重要的第三方免费开源数值计算库。它可以高效地处理任意维度的数组,是Python用于进行科学计算的基础库之一。在数据分析、机器学习、人工智能等领域得到了广泛应用。本文将从以下几个方面介绍NumPy的用法与特性。
一、创建ndarray
NumPy最重要的数据结构是数组ndarray。创建一个ndarray的方法是使用np.array函数,传递给它一个Python列表或元组。下面的代码演示了如何创建一个一维数组:
import numpy as np a = np.array([1, 2, 3, 4, 5]) print(a)
输出:
[1 2 3 4 5]
可以使用np.asarray函数从Python列表或元组创建一个ndarray。np.zeros和np.ones函数可以创建全零或全一数组。np.eye函数可以创建单位矩阵。下面的代码演示了如何创建一个二维数组:
b = np.array([[1, 2], [3, 4]]) print(b) c = np.asarray([(1, 2), (3, 4)]) print(c) d = np.zeros((3, 4)) print(d) e = np.ones((2, 3)) print(e) f = np.eye(5) print(f)
输出:
[[1 2] [3 4]] [[1 2] [3 4]] [[0. 0. 0. 0.] [0. 0. 0. 0.] [0. 0. 0. 0.]] [[1. 1. 1.] [1. 1. 1.]] [[1. 0. 0. 0. 0.] [0. 1. 0. 0. 0.] [0. 0. 1. 0. 0.] [0. 0. 0. 1. 0.] [0. 0. 0. 0. 1.]]
二、数组操作
NumPy可以对数组进行多种操作。数组加法、减法、乘法、除法等运算都是可以直接使用的。np.dot函数可以进行矩阵乘法。
a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) c = a + b print(c) d = a - b print(d) e = a * b print(e) f = a / b print(f) g = np.dot(a, b) print(g)
输出:
[5 7 9] [-3 -3 -3] [ 4 10 18] [0.25 0.4 0.5 ] 32
可以使用ndarray的大量方法对数组进行操作。如ndarray.shape可以获取数组的形状,比如一个n行m列的数组,shape的返回值为(n, m)。ndarray.size可以获取数组元素的总数。ndarray.reshape可以改变数组的形状,使其变为另一个形状。ndarray.transpose可以将数组转置。下面的代码演示了这些方法的用法:
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(a.shape) print(a.size) b = a.reshape(1, 9) print(b) c = a.transpose() print(c)
输出:
(3, 3) 9 [[1 2 3 4 5 6 7 8 9]] [[1 4 7] [2 5 8] [3 6 9]]
三、索引与切片
NumPy的数组索引方式与Python中列表的方式相同。可以使用中括号[]对数组进行索引。对于一个n维数组,需要指定n个下标才能获取到某一个元素。也可以对数组进行切片,获取数组的部分元素。可以使用冒号:对数组进行切片。下面的代码演示了数组的索引与切片:
a = np.array([1, 2, 3, 4, 5]) print(a[0]) print(a[-1]) print(a[1:4]) print(a[:3]) print(a[3:]) print(a[:-2]) print(a[::2]) b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(b[1][2]) print(b[1, 2]) print(b[0:2, 1:3])
输出:
1 5 [2 3 4] [1 2 3] [4 5] [1 2 3] [1 3 5] 6 6 [[2 3] [5 6]]
四、广播(Broadcasting)
NumPy中的广播是一种强大的机制,它可以将不同形状的数组进行计算。例如,将一个形状为(3, 1)的数组与一个形状为(1, 3)的数组相加会产生一个形状为(3, 3)的数组。广播的机制使得数组的运算非常方便和高效。下面的代码演示了广播的用法:
a = np.array([1, 2, 3]) b = 2 c = a + b print(c) d = np.array([[1, 2, 3], [4, 5, 6]]) e = np.array([1, 2, 3]) f = d + e print(f) g = np.array([[1], [2], [3]]) h = np.array([4, 5, 6]) i = g * h print(i)
输出:
[3 4 5] [[2 4 6] [5 7 9]] [[ 4 5 6] [ 8 10 12] [12 15 18]]
五、NumPy的常用统计方法
NumPy中的ndarray类型提供了几种不同的统计函数。最常用的函数包括计算数组中所有元素的求和、均值和标准差等。下面的代码演示了一些常用的统计函数:
a = np.array([1, 2, 3, 4, 5]) print(np.sum(a)) print(np.mean(a)) print(np.std(a)) b = np.array([[1, 2], [3, 4]]) print(np.sum(b)) print(np.sum(b, axis=0)) print(np.sum(b, axis=1))
输出:
15 3.0 1.4142135623730951 10 [4 6] [3 7]
六、随机数生成
在数据分析和机器学习中,随机数生成是非常重要的。NumPy提供了大量的随机数生成函数。下面的代码演示了一些常用的随机数生成函数:
a = np.random.rand(3, 3) print(a) b = np.random.randn(3, 3) print(b) c = np.random.randint(1, 10, size=(3, 3)) print(c) d = np.random.choice([1, 2, 3, 4, 5], size=(3, 3)) print(d)
输出:
[[0.52451401 0.73476582 0.72145149] [0.12381385 0.98456016 0.90398534] [0.25585383 0.42355746 0.0779397 ]] [[ 1.18620182 0.19244916 0.95212394] [ 0.31774084 -0.51186413 0.15535013] [-0.7440901 -0.19090821 -0.33039907]] [[1 6 3] [5 9 6] [9 1 9]] [[3 3 2] [5 4 5] [4 3 2]]
七、文件输入输出
NumPy提供了用于读取和写入磁盘数据的函数。ndarray可以保存到磁盘文件中,并从磁盘文件中加载。下面的代码演示了文件输入输出的用法:
a = np.array([1, 2, 3, 4, 5]) np.save('a.npy', a) b = np.load('a.npy') print(b)
输出:
[1 2 3 4 5]
八、小结
本文介绍了NumPy的基本用法,包括创建ndarray、数组操作、索引与切片、广播、常用的统计方法、随机数生成和文件输入输出。NumPy具有高效的数组处理能力,是进行科学计算和数据分析的重要工具。NumPy的完整代码可以参考下面的代码块:
import numpy as np # 创建ndarray a = np.array([1, 2, 3, 4, 5]) print(a) b = np.array([[1, 2], [3, 4]]) print(b) c = np.asarray([(1, 2), (3, 4)]) print(c) d = np.zeros((3, 4)) print(d) e = np.ones((2, 3)) print(e) f = np.eye(5) print(f) # 数组操作 a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) c = a + b print(c) d = a - b print(d) e = a * b print(e) f = a / b print(f) g = np.dot(a, b) print(g) a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(a.shape) print(a.size) b = a.reshape(1, 9) print(b) c = a.transpose() print(c) # 索引与切片 a = np.array([1, 2, 3, 4, 5]) print(a[0]) print(a[-1]) print(a[1:4]) print(a[:3]) print(a[3:]) print(a[:-2]) print(a[::2]) b = np.array([[1, 2, 3], [4, 5, 6]]) print(b[1][2]) print(b[1, 2]) print(b[0:2, 1:3]) # 广播 a = np.array([1, 2, 3]) b = 2 c = a + b print(c) d = np.array([[1, 2, 3], [4, 5, 6]]) e = np.array([1, 2, 3]) f = d + e print(f) g = np.array([[1], [2], [3]]) h = np.array([4, 5, 6]) i = g * h print(i) # 常用统计方法 a = np.array([1, 2, 3, 4, 5]) print(np.sum(a)) print(np.mean(a)) print(np.std(a)) b = np.array([[1, 2, 3], [4, 5, 6]]) print(np.sum(b)) print(np.sum(b, axis=0)) print(np.sum(b, axis=1)) # 随机数生成 a = np.random.rand(3, 3) print(a) b = np.random.randn(3, 3) print(b) c = np.random.randint(1, 10, size=(3, 3)) print(c) d = np.random.choice([1, 2, 3, 4, 5], size=(3, 3)) print(d) # 文件输入输出 a = np.array([1, 2, 3, 4, 5]) np.save('a.npy', a) b = np.load('a.npy') print(b)