📜  Python列表 VS Numpy 数组

📅  最后修改于: 2022-05-13 01:54:23.767000             🧑  作者: Mango

Python列表 VS Numpy 数组

NumPy是Python中科学计算的基础包。 NumPy 数组有助于对大量数据进行高级数学运算和其他类型的运算。通常,与使用 Python 的内置序列相比,此类操作的执行效率更高,代码更少。 NumPy 不是另一种编程语言,而是Python扩展模块。它提供对同类数据数组的快速高效的操作。

关于 Numpy 数组的一些要点:

  • 我们可以使用 numpy.array() 在Python中创建一个 N 维数组。
  • 数组默认是同质的,这意味着数组中的数据必须是相同的数据类型。 (请注意,您也可以在Python中创建结构化数组)。
  • 元素明智的操作是可能的。
  • Numpy 数组具有各种函数、方法和变量,以简化我们的矩阵计算任务。
  • 数组的元素连续存储在内存中。例如,二维数组的所有行必须具有相同的列数。或者一个三维数组必须在每张卡片上具有相同的行数和列数。

Numpy 数组的表示:

  • 一维 Numpy 数组;
    import numpy as np
      
    a = np.array([1, 2, 3])
    print(a)
    
    输出:
    [1 2 3]
    
  • 多维 Numpy 数组:
    import numpy as np
      
    a = np.array([(1, 2, 3), (4, 5, 6)])
    print(a)
    
    输出:
    [[1 2 3]
     [4 5 6]]
    

在Python列表中使用 Numpy 数组的优点:

  • 消耗更少的内存。
  • 与Python列表相比快。
  • 使用方便。

列表:列表是有序且可变的集合。在Python中,列表是用方括号编写的。

关于Python列表的一些要点:

  • 该列表可以是同质的或异质的。
  • 列表中无法进行元素明智的操作。
  • Python列表默认是一维的。但是我们可以创建一个 N 维列表。但是也将是一维列表存储另一个一维列表
  • 列表的元素在内存中不需要是连续的。

下面是一些示例,通过分析内存消耗、执行时间比较和两者支持的操作,清楚地展示了 Numpy 数组如何优于Python列表。

示例 1:Numpy 数组和列表之间的内存消耗
在此示例中,将创建一个Python列表和一个大小为 1000 的 Numpy 数组。将计算每个元素的大小,然后计算两个容器的整体大小,并根据内存消耗进行比较。

下面是实现。

# importing numpy package
import numpy as np
  
# importing system module
import sys
  
# declaring a list of 1000 elements 
S= range(1000)
  
# printing size of each element of the list
print("Size of each element of list in bytes: ",sys.getsizeof(S))
  
# printing size of the whole list
print("Size of the whole list in bytes: ",sys.getsizeof(S)*len(S))
  
# declaring a Numpy array of 1000 elements 
D= np.arange(1000)
  
# printing size of each element of the Numpy array
print("Size of each element of the Numpy array in bytes: ",D.itemsize)
  
# printing size of the whole Numpy array
print("Size of the whole Numpy array in bytes: ",D.size*D.itemsize)
输出:
Size of each element of list in bytes:  48
Size of the whole list in bytes:  48000
Size of each element of the Numpy array in bytes:  8
Size of the whole Numpy array in bytes:  8000

示例 2:Numpy 数组和Python列表之间的时间比较
在这个例子中,将创建 2 个Python列表和 2 个 Numpy 数组,每个容器有 1000000 个元素。将分别执行列表和 Numpy 数组中的元素相乘,并分析两个容器执行所需的时间差异,以确定哪个容器执行操作所需的时间更少。

下面是实现。

# importing required packages
import numpy
import time
   
# size of arrays and lists
size = 1000000  
   
# declaring lists
list1 = range(size)
list2 = range(size)
   
# declaring arrays
array1 = numpy.arange(size)  
array2 = numpy.arange(size)
   
# capturing time before the multiplication of Python lists
initialTime = time.time()
  
# multiplying  elements of both the lists and stored in another list
resultantList = [(a * b) for a, b in zip(list1, list2)]
   
# calculating execution time
print("Time taken by Lists to perform multiplication:", 
      (time.time() - initialTime),
      "seconds")
   
# capturing time before the multiplication of Numpy arrays
initialTime = time.time()
  
# multiplying  elements of both the Numpy arrays and stored in another Numpy array 
resultantArray = array1 * array2
   
# calculating execution time 
print("Time taken by NumPy Arrays to perform multiplication:",
      (time.time() - initialTime),
      "seconds")
输出:
Time taken by Lists : 0.15030384063720703 seconds
Time taken by NumPy Arrays : 0.005921125411987305 seconds

示例 3:操作对 Numpy 数组和Python列表的影响
在此示例中,演示了Python列表无法执行基本操作。将声明一个Python列表和一个具有相同元素的 Numpy 数组,并且将添加一个整数以将容器的每个元素递增该整数值,而无需循环语句。将分析此操作对 Numpy 数组和Python列表的影响。

下面是实现。

# importing Numpy package
import numpy as np
  
# declaring a list
ls =[1, 2, 3]
  
# converting the list into a Numpy array
arr = np.array(ls)
  
try:
    # adding 4 to each element of list
    ls = ls + 4
      
except(TypeError):
    print("Lists don't support list + int")
  
# now on array
try:
    # adding 4 to each element of Numpy array
    arr = arr + 4
  
    # printing the Numpy array
    print("Modified Numpy array: ",arr)
      
except(TypeError):
    print("Numpy arrays don't support list + int")
输出:
Lists don't support list + int
Modified Numpy array: [5 6 7]