第一章 NumPy介绍

NumPy入门教程

第一章 NumPy 介绍
第二章 ndarray的创建及其属性
第三章 ndarray的基本操作
第四章 ndarray的索引、切片和遍历
第五章 ndarray的重塑、组合和拆分
第六章 用于ndarray的文件操作
第七章 ndarray的赋值、视图、拷贝和广播



前言

NumPy 是使用Python进行科学计算的基础软件包。它包括:

  • 功能强大的N维数组对象。
  • 精密广播功能函数。
  • 集成 C/C+和Fortran 代码的工具。
  • 强大的线性代数、傅立叶变换和随机数功能。

一、多维数组介绍

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)
>>>
>>> my_arr
array([0, 1, 2, 3, 4, 5, 6])

在上面的例子中,首先,导入 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)
>>>
>>> my_arr[0]
0
>>> my_arr[-1]
6
>>> my_arr[2:4]
array([2, 3])

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

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

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


二、ndarray 的优势

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

1.更少的存储空间

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

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
>>>
>>> size_of_list_object
120
>>> size_of_elements
84
>>> total_list_size
204
>>>
>>> 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
>>>
>>> size_of_list_object
120
>>> size_of_elements
112
>>> total_list_size
232
>>> my_list3 = []
>>>
>>> sys.getsizeof(my_list3)
56

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

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
>>>
>>> size_of_array_object
128
>>> size_of_elements
24
>>>
>>> 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
>>>
>>> size_of_array_object
136
>>> size_of_elements
32
>>>
>>> my_arr3 = np.array([])
>>> sys.getsizeof(my_arr3)
104

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

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
>>>
>>> list_cost_time
0.12406277656555176
>>>
>>> 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
>>>
>>> arr_cost_time
0.013792991638183594
>>>
>>> list_cost_time / arr_cost_time
8.994624213510336

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

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")
...
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")
...
...
Modified Numpy array:  [5 6 7]

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


总结

本章我们对NumPy中的多维数组进行了介绍,另外还介绍了多维数组的优势,包括更少的存储空间,更快的处理速度,更方便的操作。

下一章 ndarray的创建及属性

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值