Numpy 基础教程之Numpy的介绍

简介: Numpy(Numerical Python 的简称),是 Python 数值计算最重要的基础包之一,大多数提供科学计算的包都以 Numpy 的 ndarray(多维数组)为构建基础。下面我们就通过一些实例来初步了解下 ndarray,要想使用 ndarray,需要导入 numpy 库。ndarray 的创建非常简单,只需要将列表传入到 array() 函数即可。

1. 多维数组介绍

Numpy(Numerical Python 的简称),是 Python 数值计算最重要的基础包之一,大多数提供科学计算的包都以 Numpy 的 ndarray(多维数组)为构建基础。下面我们就通过一些实例来初步了解下 ndarray,要想使用 ndarray,需要导入 numpy 库。ndarray 的创建非常简单,只需要将列表传入到 array() 函数即可。例如:

import numpy as np
my_list = [0, 1, 2, 3, 4, 5, 6]
my_arr = np.array(my_list)
print(my_arr)

在上面的例子中,首先,导入 numpy 库;其次,创建一个列表并将列表传入到 array() 函数。这样便创建了一个 ndarray my_arr。ndarray 创建完成后,我们可以使用索引的方式对数组中的元素进行访问:

import numpy as np
my_list = [0, 1, 2, 3, 4, 5, 6]
my_arr = np.array(my_list)
print(my_arr[0])
print(my_arr[-1])
print(my_arr[2:4])

上面的例子中创建的是一维数组,二维数组的创建方式是一样的,例如:

import numpy as np
my_list = [[0, 1, 2], [3, 4, 5]]
my_arr = np.array(my_list)
print(my_arr[0][0])
print(my_arr[1][2])

上面的代码中,向 array() 函数传入了一个二维列表,这样便得到了一个二维数组。同样的,我们可以通过索引的方式对数组内的元素进行访问。

2. ndarray 的优势

既然 ndarray 和列表这么相似,在已经有了列表的情况下为什么还需要ndarray 呢?下面我们就来看下,ndarray 相对于列表来说的优势:

2.1 更少的存储空间

我们通过例子来看下 ndarray 和列表占用存储空间的对比:

2.1.1 列表的存储空间

import numpy as np
import sys
my_list1 = [1, 2, 3]
size_of_list_object = sys.getsizeof(my_list1)
size_of_elements = len(my_list1) * sys.getsizeof(my_list1[0])
total_list_size = size_of_list_object + size_of_elements
print("Size without the size of the elements: ", size_of_list_object)
print("Size of all the elements: ", size_of_elements)
print("Total size of list, including elements: ", total_list_size)
my_list2 = [1, 2, 3, 4]
size_of_list_object = sys.getsizeof(my_list2)
size_of_elements = len(my_list2) * sys.getsizeof(my_list2[0])
total_list_size = size_of_list_object + size_of_elements
print("Size without the size of the elements: ", size_of_list_object)
print("Size of all the elements: ", size_of_elements)
print("Total size of list, including elements: ", total_list_size)
my_list3 = []
print(sys.getsizeof(my_list3))

从上述代码的输出,我们可以推断出,列表对象本身(不包含元素)的大小为 56 个字节,每增加一个元素,元素本身的大小为 28 个字节,指向元素的指针大小为 8 个字节。存储的结构如下图所示:

网络异常,图片无法展示
|

2.1.2 ndarray 的存储空间

import numpy as np
import sys
my_arr1 = np.array([1, 2, 3])
size_of_array_object = sys.getsizeof(my_arr1)
size_of_elements = my_arr1.itemsize * my_arr1.size
print("Size without the size of the elements: ", size_of_array_object)
print("Size of all the elements: ", size_of_elements)
my_arr2 = np.array([1, 2, 3, 4])
size_of_array_object = sys.getsizeof(my_arr2)
size_of_elements = my_arr2.itemsize * my_arr2.size
print("Size without the size of the elements: ", size_of_array_object)
print("Size of all the elements: ", size_of_elements)
my_arr3 = np.array([])
print(sys.getsizeof(my_arr3))

从上述代码的输出,我们可以推断出,ndarray 对象的大小包含了元素在内。不包含任何元素的 ndarray 对象的大小为 96 字节,每增加一个元素,增加 8 个字节。存储的结构如下图所示:

网络异常,图片无法展示
|

2.2 更快的处理速度

在下面的例子中我们比较两个列表相乘和两个数组相乘的耗时,代码如下:

import time
import numpy as np
size = 1000000
my_list1 = range(size)
my_list2 = range(size)
my_arr1 = np.arange(size)
my_arr2 = np.arange(size)
begin_list_time = time.time()
result_list = [(a * b) for a, b in zip(my_list1, my_list2)]
end_list_time = time.time()
list_cost_time = end_list_time - begin_list_time
print("Time taken by Lists to perform multiplication:", list_cost_time, "seconds")
begin_arr_time = time.time()
result_arr = my_arr1 * my_arr2
end_arr_time = time.time()
arr_cost_time = end_arr_time - begin_arr_time
print("Time taken by NumPy Arrays to perform multiplication:", arr_cost_time, "seconds")
print("Numpy in this example is " + str(list_cost_time / arr_cost_time) + "faster!")

从输出结果可以看出,两个数组相乘的速度比两个列表相乘的速度快几倍。

2.3 更方便的操作

ndarray 支持元素方式的操作,在进行一些运算时往往会很方便,例如:

import numpy as np
my_list = [1, 2, 3]
my_arr = np.array(my_list)
try:
    my_list = my_list + 4
except(TypeError):
    print("Lists don't support list + int")
try:
    my_arr = my_arr + 4
    print("Modified Numpy array: ", my_arr)
except(TypeError):
    print("Numpy arrays don't support list + int")

从上面例子的输出可以看出,如果想对列表中的每个元素加 4,列表不支持 my_list = my_list + 4 操作,而 ndarray 是支持 my_arr = my_arr + 4 操作的。所以,进行一些运算会非常方便。

3. 总结

网络异常,图片无法展示
|

相较于 python 中的列表来说,下列选项中哪一项不是 ndarray 的优势?

A. 更少的存储空间。

B. 更快的处理速度。

C. 更方便的操作。

D. ndarray 支持索引操作。

相关文章
|
3月前
|
Python
NumPy 教程 之 NumPy 矩阵库(Matrix) 4
矩阵是由行和列构成的矩形数组,其元素可以是数字、符号或数学表达式。
34 4
|
3月前
|
Python
NumPy 教程 之 NumPy 矩阵库(Matrix) 2
不同于ndarray,matlib函数生成的是矩阵形式。教程中详细解释了矩阵的概念,并介绍了转置矩阵的实现方式,使用T属性或函数实现。此外,还展示了如何利用`matlib.empty()`创建指定形状的新矩阵,并可选择数据类型及顺序。最后通过示例演示了矩阵填充随机数据的方法。
35 3
|
3月前
|
数据可视化 Python
NumPy 教程 之 NumPy Matplotlib 7
使用Python的绘图库Matplotlib与NumPy结合进行数据可视化,提供Matplotlib作为MatLab开源替代方案的有效方法,以及如何利用plt()函数将数据转换成直观的直方图示例。
42 11
|
3月前
|
Python
NumPy 教程 之 NumPy Matplotlib 6
Matplotlib 是一个强大的 Python 绘图库,能与 NumPy 协同工作,提供类似 MatLab 的开源替代方案,并支持 PyQt 和 wxPython 等图形工具包。通过 `numpy.histogram()` 函数示例,展示了如何创建数据频率分布图,该函数接受输入数组和 bin 参数,生成对应频率的直方图。示例代码及输出清晰展示了 bin 的边界与对应频率的关系。
35 11
|
3月前
|
Python
NumPy 教程 之 NumPy Matplotlib 4
使用 Python 的绘图库 Matplotlib,结合 NumPy,生成各种图形,作为 MatLab 的开源替代方案。您将学习到如何用 matplotlib 和 NumPy 包来创建正弦波图形,以及如何在同一图中利用 subplot() 函数组织和展示不同的子图,例如同时绘制正弦和余弦曲线。通过实际代码示例,加深对这些功能的理解。
43 12
|
3月前
|
Python
NumPy 教程 之 NumPy Matplotlib 3
使用Python的绘图库Matplotlib与NumPy结合,创建有效的MatLab开源替代方案。它还支持与PyQt和wxPython等图形工具包搭配使用。通过向`plot()`函数添加特定格式字符串,可以展示离散值而非线性图。提供了多种线型和标记选项,例如实线`-`、虚线`--`、点标记`.`等,以及颜色缩写如蓝色`b`、绿色`g`等。示例代码展示了如何用圆点表示数据点而非线条。
40 10
|
3月前
|
Python
NumPy 教程 之 NumPy Matplotlib 5
Matplotlib 是 Python 的绘图库,配合 NumPy 可作为 MatLab 的开源替代方案,并能与 PyQt 和 wxPython 等图形工具包共同使用。本教程重点讲解 `bar()` 函数用于生成条形图的方法,并通过实例展示了如何创建并显示两组数据的条形图。
36 7
|
3月前
|
存储 Python
NumPy 教程 之 NumPy IO 1
NumPy IO 教程介绍了如何使用 NumPy 读写文本及二进制数据。教程覆盖了 `.npy` 和 `.npz` 格式的文件操作,其中 `save()` 和 `load()` 函数用于单个数组的存取,而 `savez()` 则可以保存多个数组。文本文件处理则由 `loadtxt()` 和 `savetxt()` 完成。通过示例展示了 `numpy.save()` 函数的具体用法,并解释了其参数含义,如文件名、数组对象以及序列化选项等。
42 10
|
3月前
|
Serverless Python
NumPy 教程 之 NumPy 线性代数 7
NumPy 的 `linalg` 库提供了丰富的线性代数功能,如点积、矩阵乘法、求解线性方程等。`numpy.linalg.inv()` 用于计算矩阵的乘法逆矩阵,即找到满足 `AB=BA=E` 的矩阵 `B`,其中 `E` 是单位矩阵。示例展示了如何对矩阵 `A` 计算其逆矩阵 `A^(-1)` 并求解线性方程 `A^(-1)B`,得到向量 `[5, 3, -2]` 作为解。
53 10
|
3月前
|
索引 Python
NumPy 教程 之 NumPy 线性代数 4
NumPy 的线性代数库 `linalg` 提供了丰富的线性代数功能,如点积(`dot`)、向量点积(`vdot`)、内积(`inner`)、矩阵积(`matmul`)、行列式(`determinant`)、求解线性方程(`solve`)和矩阵逆(`inv`)。其中,`numpy.matmul` 用于计算两个数组的矩阵乘积,支持多维数组操作。
37 11