2.numpy总结

Numpy

Numpy介绍

​ Numpy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组。

​ Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。

​ Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。

ndarray介绍

NumPy provides an N-dimensional array type, the ndarray, which describes a collection of “items” of the same type.

NumPy提供了一个N维数组类型ndarray,它描述了相同类型的“items”的集合。

在这里插入图片描述

用ndarray进行存储:

import numpy as np

# 创建ndarray
score = np.array([[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69],
[76, 87, 75, 67, 86],
[70, 79, 84, 67, 84],
[94, 92, 93, 67, 64],
[86, 85, 83, 67, 80]])

score
#返回结果:
#array([[80, 89, 86, 67, 79],
#        [78, 97, 89, 67, 81],
#        [90, 94, 78, 67, 74],
#        [91, 91, 90, 67, 69],
#        [76, 87, 75, 67, 86],
#        [70, 79, 84, 67, 84],
#        [94, 92, 93, 67, 64],
#        [86, 85, 83, 67, 80]])

ndarray与Python原生list运算效率对比

import random
import time
import numpy as np
a = []
for i in range(100000000):
    a.append(random.random())

# 通过%time魔法方法, 查看当前行的代码运行一次所花费的时间
%time sum1=sum(a)
#Wall time: 308 ms
b=np.array(a)
%time sum2=np.sum(b)
#Wall time: 91 ms

机器学习的最大特点就是大量的数据运算,那么如果没有一个快速的解决方案,那可能现在python也在机器学习领域达不到好的效果。

在这里插入图片描述

Numpy专门针对ndarray的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优势就越明显。

思考:ndarray为什么可以这么快?

ndarray的优势

内存块风格

ndarray到底跟原生python列表有什么不同呢,请看一张图:

在这里插入图片描述

从图中我们可以看出ndarray在存储数据的时候,数据与数据的地址都是连续的,这样就给使得批量操作数组元素时速度更快。

这是因为ndarray中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以ndarray在存储元素时内存可以连续,而python原生list就只能通过寻址方式找到下一个元素,这虽然也导致了在通用性能方面Numpy的ndarray不及Python原生list,但在科学计算中,Numpy的ndarray就可以省掉很多循环语句,代码使用方面比Python原生list简单的多。

ndarray支持并行化运算(向量化运算)
效率远高于纯Python代码

Numpy底层使用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,所以,其效率远高于纯Python代码。

N维数组-ndarray

ndarray的属性

数组属性反映了数组本身固有的信息。

属性名字 属性解释
ndarray.shape 数组维度的元组
ndarray.ndim 数组维数
ndarray.size 数组中的元素数量
ndarray.itemsize 一个数组元素的长度(字节)
ndarray.dtype 数组元素的类型
ndarray的形状
import numpy as np

# 首先创建一些数组。
# 创建不同形状的数组
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([1, 2, 3, 4])
c = np.array([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]])
# 分别打印出形状
print(a.shape)
print(b.shape)
print(c.shape)
# (2, 3)  # 二维数组
# (4,)    # 一维数组
# (2, 2, 3) # 三维数组

如何理解数组的形状?

二维数组:

在这里插入图片描述

三维数组:

在这里插入图片描述

ndarray的类型
type(score.dtype)

<type 'numpy.dtype'>

dtype是numpy.dtype类型,先看看对于数组来说都有哪些类型

名称 描述 简写
np.bool 用一个字节存储的布尔类型(True或False) ‘b’
np.int8 一个字节大小,-128 至 127 ‘i’
np.int16 整数,-32768 至 32767 ‘i2’
np.int32 整数,-2 31 至 2 32 -1 ‘i4’
np.int64 整数,-2 63 至 2 63 - 1 ‘i8’
np.uint8 无符号整数,0 至 255 ‘u’
np.uint16 无符号整数,0 至 65535 ‘u2’
np.uint32 无符号整数,0 至 2 ** 32 - 1 ‘u4’
np.uint64 无符号整数,0 至 2 ** 64 - 1 ‘u8’
np.float16 半精度浮点数:16位,正负号1位,指数5位,精度10位 ‘f2’
np.float32 单精度浮点数:32位,正负号1位,指数8位,精度23位 ‘f4’
np.float64 双精度浮点数:64位,正负号1位,指数11位,精度52位 ‘f8’
np.complex64 复数,分别用两个32位浮点数表示实部和虚部 ‘c8’
np.complex128 复数,分别用两个64位浮点数表示实部和虚部 ‘c16’
np.object_ python对象 ‘O’
np.string_ 字符串 ‘S’
np.unicode_ unicode类型 ‘U’

创建数组的时候指定类型

import numpy as np
a = np.array([[1, 2, 3],[4, 5, 6]], dtype=np.float32)
a.dtype
# dtype('float32')

arr =<
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在PyTorch中,当使用autograd跟踪张量的操作历史时,有时需要从计算图中分离张量以进行进一步的计算。在这种情况下,可以使用`detach()`方法来创建一个新的张量,该张量与原始张量具有相同的值,但不再与计算图相关联。 然后,如果需要将该张量转换为NumPy数组,可以使用`numpy()`方法。因此,`tensor.detach().numpy()`的含义是将张量分离并转换为NumPy数组。 ### 回答2: tensor.detach().numpy() 是 PyTorch 中用来将一个 tensor 断开与计算图的连接,并将其转换为 NumPy 数组的方法。 首先,tensor.detach() 的作用是返回一个新的 tensor,该 tensor 取消了与当前计算图的关联。这意味着我们无法再通过新的 tensor 进行求导操作,因为它已经与计算图分离了。 接着,我们调用 numpy() 方法将该 tensor 转换为一个 NumPy 数组。NumPy 是一个广泛使用的 Python 数学库,它提供了对多维数组对象的支持,并且提供了大量的数学函数用于数组操作。 这个方法在深度学习中非常常用,它能够将 tensor 对象转换为 NumPy 数组,从而方便地与其他 Python 库进行集成。因为 NumPy 数组与 tensor 对象之间可以互相转换,所以我们可以方便地在 PyTorch 和 NumPy 之间进行数据传递和计算,以满足特定需求。 总结来说,tensor.detach().numpy() 是一个在 PyTorch 中将一个 tensor 对象断开与计算图的连接,并将其转换为 NumPy 数组的方法,可以用于方便地将数据与其他 Python 库进行集成和操作。 ### 回答3: tensor.detach().numpy()是将PyTorch张量(tensor)从计算图中分离出来,并将其转换为NumPy数组(numpy.ndarray)的操作。 在PyTorch中,张量可以参与计算图中的运算以进行自动求导。当我们想要获取一个张量的值,但又不需要梯度信息时,可以使用detach()方法将其从计算图中分离出来。分离后的张量将不再与原计算图产生任何关联,并且无法进行反向传播。 detach()方法返回分离后的张量,而后可以使用numpy()方法将其转换为NumPy数组。NumPy是一个常用的Python库,用于科学计算和数据处理。将张量转换为NumPy数组可以方便地在NumPy环境下进行操作和分析。 因此,tensor.detach().numpy()的操作可以帮助我们从PyTorch张量中获取不需要梯度信息的值,并将其转换为NumPy数组,以便在NumPy环境下进行进一步的处理和分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值