您的位置:

Python NumPy:科学计算的基础库

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)