Numpy中的ndarray.T比transpose(ndarray)快的原因

Numpy中的ndarray.T比transpose(ndarray)快的原因

在本文中,我们将介绍在Numpy中ndarray.T比transpose(ndarray)快的原因。假设我们有一个2D的数据数组arr,那么arr.transpose()和arr.T都可以将其转置。但是,经过测试,我们会发现使用arr.T要比arr.transpose()的速度快得多。下面我们将深入探究这个问题。

阅读更多:Numpy 教程

关于Numpy

在深入探讨numpy.ndarray.T和numpy.transpose(numpy.ndarray)的比较之前,让我们先了解一下Numpy是什么。Numpy是一个Python库,用于进行科学计算和数据处理。它提供了高效的多维数组操作接口,以及用于处理这些数组的相关函数。Numpy的核心数据结构是ndarray(N-dimensional array),它是一个经过优化的数据结构,可用于存储大量数据。这些数组可以包含整数、浮点数和其他Python对象等各种数据类型。

ndarray.T 和 transpose(ndarray)的定义

ndarray.T是返回数组的转置(transpose)的属性。它的作用相当于调用transpose函数,transpose是对ndarray的操作,将其转置。

numpy.transpose(numpy.ndarray)的定义

transpose方法将ndarray的维度进行调转,具体操作是以一条对角线为轴,将数组分为左上和右下两个部分,然后交换数组的两个部分的位置。

ndarray.T和transpose(ndarray)的效率比较

在Numpy中,使用ndarray.T和numpy.transpose(numpy.ndarray)进行转置是非常常见的操作。虽然两者都可以达到相同的结果,但它们的效率不同。我们通过下面的例子比较它们的速度:

import numpy as np
arr = np.random.rand(1000, 1000)

%timeit arr.T
# 输出:19.1 µs ± 319 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit np.transpose(arr)
# 输出:96.8 µs ± 3.91 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

这里我们生成了一个1000 x 1000的随机数组,并对两种转置方式进行了测试。经过测试,我们可以发现,使用ndarray.T的速度比numpy.transpose(numpy.ndarray)快很多。

ndarray.T比numpy.transpose(numpy.ndarray)快的原因

通过上面的测试,我们知道ndarray.T比numpy.transpose(numpy.ndarray)快。那么是为什么呢?下面我们来分析一下。

首先,ndarray.T是数组的属性,也就是对数组做的操作,因此只需要获取数组的属性值即可。由于数组在内存中是以按行的方式存储的,因此在获取转置后的数组时,它不需要改变存储方式。而numpy.transpose(numpy.ndarray)则是对数组进行操作,需要创建一个新的数组来保存转置后的结果。此外,numpy.transpose(numpy.ndarray)还需要为转置后的数组重新分配内存空间,这也是造成它速度慢的原因之一。

咱们可以通过打印arr.base属性来看一下,发现arr.T返回的数组数据和arr相同,因为只是改变了axis的顺序,没有创建新的数组;而numpy.transpose()返回的是新的数组对象,需要重新分配内存空间。

print(arr.base is None)  # 输出:True,说明arr不是其他数组的视图
print(arr.T.base is arr)  # 输出:True,说明arr.T是arr的视图

print(np.transpose(arr).base is None)  # 输出:False,说明np.transpose(arr)是新的数组对象

此外,ndarray.T中使用了不同的数组访问模式,比numpy.transpose(numpy.ndarray)更简单直接。在Numpy中,每个数组都有一个strides属性,表示在内存中跨越任意两个元素所需的字节数。当我们比较ndarray.T和numpy.transpose(numpy.ndarray)的效率时,可以发现它们在读取和写入内存时的字节跨度不同。具体来说,当使用arr.T时,Numpy只需要在内存中跳过arr.strides[1]个字节即可。而在使用numpy.transpose(numpy.ndarray)时,由于需要创建新的数组并重新分配内存,因此在写入和读取内存时需要跳过更多的字节。这也是造成性能损失的另一个原因。

怎样选择适合的转置方式

在实际编程中,我们需要根据具体的场景来决定使用哪种转置方式。如果只是需要获取数组的转置而不需要创建新的数组,那么使用ndarray.T将是一个更好更快的选择。如果需要创建新的数组,则可以使用numpy.transpose(numpy.ndarray)。此外,我们还可以使用numpy.swapaxes()来交换数组的两个轴,这也是另一种转置数组的方式。

总结

本文介绍了在Numpy中,ndarray.T比numpy.transpose(numpy.ndarray)更快的原因。具体来说,这是由于ndarray.T只是获取数组的属性而不是在内存中新建数组,因此速度更快。在实际编程中,我们需要根据具体的场景来选择适合的转置方式。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程