您的位置
主页 > 产权交易 » 正文

「Python进阶」你真的明白NumPy中的ndarray吗?

来源:www.nazbcg.com 点击:1224

欢迎来到专栏《Python进阶》。在本专栏中,我们将介绍python的各种高级操作,包括python对文件和数据的处理,以及python的各种有用库(如numpy、scipy、matplotlib和pandas)的使用。我们的初衷是让您更好地掌握python语言,并让它对我有用。

今天是《Python进阶》专栏的第三期。在本期中,我们将介绍一些关于numpy的高级知识。

作者唐兴旺

编辑有三个词

如果你想精通python,那么numpy是你必须精通的东西。numpy实际上是python语言的一个扩展库,它支持高维数组和矩阵操作,并提供了大量数学函数库。

我们知道numpy最重要的特性之一是它的n维数组对象ndarray。通常ndarray内部包含以下内容。

数据指针:指向实际数据的指针;

数据类型(DTYPE):描述数组中每个元素占用的字节数;

表示数组形状(每个维度的大小)的元组。

跨步:表示需要从当前元素跨越到下一个元素的字节数的字节数。

我们使用以下代码查看ndarray的内容:

将numpy导入为np

a=np.arange(1,25).整形((2,2,2,3))

打印(类型(a))

打印(a.shape)

打印(a.dtype)

打印(a.strides)

这里的形状是指每个维度中的元素数量。这里,四维阵列的每个维度中的元素数量分别为2,2,2和3。哦,这似乎不对! 2 + 2 + 2 + 3=9,这不等于24!我的分析错了吗?

当然不是,我们先输出一个,结果如下:

这里最里面的层[]可以表示内部有3个元素的一维数组。一对粗体的红色[]表示一个二维数组,其中有两个[],即二维数组中的两个一维数组。所以认为第三维中的元素数量是2;厚紫色对[]表示三维数组,有两个[],即三维数组中有两个二维数组。因此,认为第二维中的元素数是2.类似地,第一维中的元素数是2.

我相信你现在应该明白形状中的元组是(2,2,2,3)。

完成形状后,让我们看一下dtype,它是索引组元素类型。注意,这里的数组元组引用的元素如1,2,23,24。另外,数组中每个元素的类型是相同的,在这个数组中,数组中的每个元素类型都是int32 。

最后,我们分析了下一步。它指的是需要从当前元素到下一个元素的字节数。

在上面的例子中我们可以看到strandes=(48,24,12,4)。那么这四个数字是怎么来的呢?

在上面的四维数组中,dtype是int,int占用四个字节。第四维有三个元素,总字节数是12,所以从第四维到第三维的字节数是12;在第三维(一维数组)中有两个元素,每个一维数组的总字节数是12,所以从第三维到第二维的交叉字节数是24.同样,从第二维到第一维的字节数是48.

所以上面例子中的四维数组的跨度是(48,24,12,4)。它在内存中的表示如下:

从上图可以看出,为了达到第三维(轴2),我们必须越过第四维(轴3),这需要三个元素和12个字节;为了达到第一维(轴0),我们必须越过第二,第三和第四维,总共12个元素,字节数是12 * 4=48。

这就是数据存储在NumPy中的方式。它存储在统一连续的存储块中。可以理解,NumPy在内部将多维数组存储为一维数组。通过了解每个元素的字节数和每个维度中的元素数,我们可以快速定位任何维度中的任何元素。主要。

2.1指数

在索引方面,您可能认为它非常简单,而不仅仅是通过索引获取元素?这是事实。然而,面对高维数组,很难通过索引获得元素。

接下来,我们使用一个案例来分析下一个四维数组的索引。

如果我想获得上图中的17个元素,我该怎么办?

该四维阵列首先以上图的轴的形式表示。我们可以首先将其视为四个块,其中第0轴和第1轴确定块的位置,第2轴和第3轴确定块中元素的特定位置。

图中的17是在第三个块中,如下图的黄色部分所示,0轴和1轴的索引是[1,0]。

既然确定了块的位置,我们接下来确定块中元素的位置。如下图所示:

上图中该元素的索引是[1,1]。接下来,我们只需要根据[第0轴,第1轴,第2轴,第3轴]的格式合并所确定的块的索引[1,0]和所确定的块中的元素的索引[]。在这种情况下,合并17的索引是[1,0,1,1]。

当然,您可以使用以下代码确认我们的分析是正确的。

将numpy导入为np

a=np.arange(1,25).reshape((2,2,2,3))

打印(一个[1,0,1,1])

这是高维数组的索引,你明白了吗?

2.2高维阵列转置

高维数组的转换一直是学习NumPy的难点,尽管在NumPy中你只需要调用numpy.transpose来完成转置操作,但是你可以真正分析为什么结果是这样的?特别是高维数组。我们举一个简单的例子来分析。如下:

上面的图片是原始数组,我们将通过以下代码进行转置,我们将得到以下结果:

将numpy导入为np

a=np.arange(16).整形((2,2,4))

b=a.转置((1,0,2))

打印(b)

转置结果:

我相信你们已经看到了具体的区别,即轴的索引顺序的互换。因为在代码中,我们要求0轴和1轴互换,转置后的结果实际上是a[1,0]将成为原始数组a[0,1];a[0,1]将成为原始数组a[1,0]。如果您使用图形,它看起来如下:

我相信你已经理解了这个原则,然后留下一个问题,如下所示:

对不起,怎么从左到右转置!

本文介绍了nDarray的存储机制以及高维数组的索引和换位。关于努比还有很多其他的知识。以上只是几个很难理解的问题。如果你想更系统地学习NUMPY,了解以上问题的分析过程和答案,请搬到我们的知识星球!

下一个注意事项:python库scipy的高级应用程序