首页 > 其他分享 >Numpy 基础教程之Numpy的介绍

Numpy 基础教程之Numpy的介绍

时间:2022-11-07 16:36:06浏览次数:51  
标签:arr Numpy list 介绍 基础教程 time print my size

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 个字节。存储的结构如下图所示:

Numpy 基础教程之Numpy的介绍_python

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 个字节。存储的结构如下图所示:

Numpy 基础教程之Numpy的介绍_存储空间_02

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. 总结

Numpy 基础教程之Numpy的介绍_存储空间_03

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

A. 更少的存储空间。

B. 更快的处理速度。

C. 更方便的操作。

D. ndarray 支持索引操作。

标签:arr,Numpy,list,介绍,基础教程,time,print,my,size
From: https://blog.51cto.com/u_15641375/5827290

相关文章

  • 〖TensorFlow2.0笔记22〗使用Numpy在MNIST数据集上实现3层BP神经网络!
    使用Numpy在MNIST数据集上实现3层BP神经网络!本文章是TensorFlow2.0学习笔记系列,欢迎关注该,专栏链接:​​TensorFlow2.0学习笔记​​,文章会持续更细,多希望大家点赞收藏......
  • 〖TensorFlow2.0笔记19〗过拟合介绍以及解决方法+补充: 实现GPU按需分配!
    文章目录​​一、过拟合与欠拟合​​​​1.1、欠拟合Underfitting​​​​1.2、过拟合Overfitting​​​​1.3、总结​​​​二、交叉验证​​​​2.1、如何检测过拟合​​......
  • Docker容器实战十四:Docker Compose介绍
    在前面的介绍中我们都是以单个容器为例来进行演示。但在实际的生产环境中,一个应用往往会有多个组件,并分别运行在不同的容器。在这种多容器的场景下,使用Docker客户端进行管理......
  • rustyline 介绍
    最近在写区块链的教学demo的时候,需要编写一个cli客户端和用户进行交互,最终找到了rustyline,按照官方的例子敲了一遍,觉得使用起来非常的舒适,因此推荐给大家。示例配置文件修改......
  • 008 Rust 异步编程,select 宏介绍
    select宏select宏也允许并发的执行Future,但是和join、try_join不同的是,select宏只要有一个Future返回,就会返回。示例源码usefutures::{select,future::FutureExt,pin_mut......
  • 006 Rust 异步编程,Stream 介绍
    Stream介绍​​Stream​​​和​​Future​​​类似,但是​​Future​​​对应的是一个​​item​​​的状态的变化,而​​Stream​​​则是类似于​​iterator​​​,在结束......
  • 005 Rust异步编程,Pin介绍
    为了对Future调用poll,需要使用到Pin的特殊类型。本节就介绍一下Pin类型。异步背后的一些原理例子1源码//文件src/main.rsusefutures::executor;asyncfnasync_function1()......
  • 23种设计模式之设计模式介绍(一)
    1,设计模式概述1.1软件设计模式的产生背景"设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中。1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境......
  • STK基础教程以及STK与Cesium的关系
    STK基础教程:https://www.doc88.com/p-7374957800715.htmlSTK和Cesium非常像。。Cesium的很多灵感来自于STK。其次是Insight3D>>什么是STK?它可以用来做什么呢?:https://www.......
  • pkl中list,tensor, numpy占内存的大小
    pickle中可以存储list,tensor,array类型的数据但是tensor占的内存要比list和array大的多经测试,存储nuscenemini数据集的参数信息,tensor:39Marray:23Mlist:......