Python模块:NumPy的高性能科学计算

一、NumPy初识

NumPy是Python中最流行的科学计算库之一。它提供多维数组对象和一系列用于处理数组的函数。NumPy的核心是ndarray(n-dimensional array)对象,它是一个大小固定、同一类型元素的多维数组。

在使用NumPy之前,需要先安装它。使用pip命令可以很轻松地安装它。在终端中输入以下命令即可:

pip install numpy

成功安装后,我们可以导入NumPy并查看其版本:

import numpy as np

print(np.__version__)

输出的结果应该类似于“1.16.2”。

二、NumPy数组

NumPy中最重要的对象是ndarray。可以用以下代码创建一个一维数组:

import numpy as np

arr1d = np.array([1, 2, 3, 4, 5])
print(arr1d)

输出结果:[1 2 3 4 5]

也可以创建二维、三维甚至更高维度的数组。

从列表创建ndarray时,NumPy会尝试自动推导出数组中元素的类型:

import numpy as np

arr1d = np.array([1, 2, 3, 4, 5])
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
arr3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])

print(arr1d.dtype)
print(arr2d.dtype)
print(arr3d.dtype)

输出结果:

int64
int64
int64

可以看出,NumPy会尝试选择最小的数据类型以储存数组中的元素。在这个例子中,数组中的元素都是整数,所以NumPy选择了int64类型。

数组中的元素可以使用下标进行访问,如:

import numpy as np

arr1d = np.array([1, 2, 3, 4, 5])
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
arr3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])

print(arr1d[0])
print(arr2d[0, 1])
print(arr3d[1, 0, 1])

输出结果:

1
2
6

三、NumPy的高级用法

1、数组操作

数组拼接、分裂、重塑、转置、展平等操作是NumPy中最常用的操作之一。在此仅介绍其中的一些,更多操作请参考NumPy文档。

例如,可以使用以下代码将两个一维数组沿着列方向拼接:

import numpy as np

arr1 = np.array([1,2,3])
arr2 = np.array([4,5,6])

result = np.concatenate([arr1, arr2])

print(result)

输出结果:[1 2 3 4 5 6]

还可以在二维数组上进行拼接操作,如下:

import numpy as np

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6]])

result = np.concatenate([arr1, arr2], axis=0)

print(result)

输出结果:

[[1 2]
 [3 4]
 [5 6]]

还可以使用vstack或hstack函数将数组沿着垂直或水平方向拼接。

重塑数组可以使用reshape函数。例如,可以将一个一维数组重塑为3x3的二维数组:

import numpy as np

arr = np.array([1,2,3,4,5,6,7,8,9])

result = arr.reshape((3, 3))

print(result)

输出结果:

[[1 2 3]
 [4 5 6]
 [7 8 9]]

transpos函数可以将数组转置,如下:

import numpy as np

arr = np.arange(9).reshape((3,3))

result = np.transpose(arr)

print(result)

输出结果:

[[0 3 6]
 [1 4 7]
 [2 5 8]]

flatten函数可以将多维数组展平为一维数组,如下:

import numpy as np

arr = np.arange(9).reshape((3,3))

result = arr.flatten()

print(result)

输出结果:

[0 1 2 3 4 5 6 7 8]

2、数组运算

NumPy提供了大量的数学函数和运算符,可以像操作标量一样操作数组。

可以使用以下代码实现数组的加减乘除:

import numpy as np

a = np.array([1,2,3])
b = np.array([4,5,6])

print(a + b)
print(a - b)
print(a * b)
print(a / b)

输出结果:

[5 7 9]
[-3 -3 -3]
[ 4 10 18]
[0.25 0.4  0.5 ]

可以使用以下代码实现数组的矩阵乘法:

import numpy as np

a = np.array([[1,2], [3,4]])
b = np.array([[5,6], [7,8]])

print(np.dot(a, b))

输出结果:

[[19 22]
 [43 50]]

3、数组统计

NumPy可以进行各种统计运算,如平均值、标准差、最大值、最小值等。

可以使用以下代码求数组的平均值、标准差、最大值、最小值:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])

print(np.mean(arr))
print(np.std(arr))
print(np.max(arr))
print(np.min(arr))

输出结果:

3.0
1.4142135623730951
5
1

除了一维数组之外,NumPy还可以对多维数组进行统计运算。例如,可以使用以下代码计算二维数组中每一列的平均值:

import numpy as np

arr = np.array([[1, 2], [3, 4], [5, 6]])

print(np.mean(arr, axis=0))

输出结果:

[3. 4.]

4、广播

广播是指在对两个数组进行元素操作时,当数组的形状不同时,对小数组进行扩张以匹配大数组的形状。广播操作可以减少内存使用和运算次数。

以下代码示例演示了广播的基本原理:

import numpy as np

arr1 = np.array([1,2,3])
arr2 = np.array([4,5,6])

result = arr1 * arr2

print(result)

输出结果:

[ 4 10 18]

可以看出,数组arr1和arr2的形状不同,但是它们的元素相乘得到的结果仍然是一个长度为3的数组。

5、随机数生成

NumPy还提供了大量的随机数生成函数。随机数生成函数可以用于模拟随机数据、生成测试数据等。

以下代码示例生成20个范围在0-1之间的随机数:

import numpy as np

result = np.random.rand(20)

print(result)

输出结果:

[0.13966633 0.8146751  0.78852179 0.45093637 0.73117035 0.7654889
 0.83504567 0.61635283 0.2246247  0.43220779 0.95162422 0.77052108
 0.55811285 0.61789821 0.24398802 0.02599477 0.82493305 0.36772928
 0.19407716 0.1476306 ]

6、图片处理

NumPy还可以用于图像的处理。下面的这个例子把图片中的每一个像素都进行了翻转:

import numpy as np
from PIL import Image

im = Image.open("test.jpg")
im.show()

im_arr = np.array(im)
im_arr_flip = np.fliplr(im_arr)
im_flip = Image.fromarray(im_arr_flip)

im_flip.show()

输出结果:

 #显示原图

 #显示翻转后的图

7、数据存取

NumPy可以方便地将数组保存到文件中,并从文件中读取数组数据。

以下代码示例将数组保存到文件中,并从文件中读取出来:

import numpy as np

arr = np.array([1,2,3,4,5])

np.save("arr.npy", arr)

arr_loaded = np.load("arr.npy")

print(arr_loaded)

输出结果:

[1 2 3 4 5]

总结

这篇文章介绍了NumPy的基本用法,包括数组的创建、统计、数组运算、广播、随机数生成、图片处理等。NumPy功能非常强大,有助于我们进行高效的科学计算。

本文链接:https://my.lmcjl.com/post/12985.html

展开阅读全文

4 评论

留下您的评论.