当前位置: 首页 > 面试题库 >

了解==应用于NumPy数组

燕文昌
2023-03-14
问题内容

我是Python的新手,正在学习 TensorFlow 。在使用 notMNIST数据集
的教程中,他们提供了示例代码以将标签矩阵转换为n之一的编码数组。

目标是获取一个由标签整数0 … 9组成的数组,并返回一个矩阵,其中每个整数都已转换为n之一的编码数组,如下所示:

0 -> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
1 -> [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
2 -> [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
...

他们为此提供的代码是:

# Map 0 to [1.0, 0.0, 0.0 ...], 1 to [0.0, 1.0, 0.0 ...]
labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32)

但是,我根本不了解这段代码是如何做到的。看起来它只是生成一个介于0到9之间的整数数组,然后将其与标签矩阵进行比较,然后将结果转换为浮点型。==运算符如何得出
n之一的编码矩阵


问题答案:

这里发生了一些事情:numpy的矢量操作,添加单轴和广播。

首先,您应该能够了解==魔术的作用。

假设我们从一个简单的标签数组开始。
==行为以矢量化的方式进行,这意味着我们可以将整个数组与一个标量进行比较,并获得一个包含每个逐元素比较的值的数组。例如:

>>> labels = np.array([1,2,0,0,2])
>>> labels == 0
array([False, False,  True,  True, False], dtype=bool)
>>> (labels == 0).astype(np.float32)
array([ 0.,  0.,  1.,  1.,  0.], dtype=float32)

首先,我们得到一个布尔数组,然后强制转换为浮点数:Python中的False == 0,而True == 1。因此,我们得出一个数组,该数组为0
labels(不等于0)和1(为不等于0)。

但是比较0并没有什么特别的,我们可以比较1或2或3以获得类似的结果:

>>> (labels == 2).astype(np.float32)
array([ 0.,  1.,  0.,  0.,  1.], dtype=float32)

实际上,我们可以遍历每个可能的标签并生成此数组。我们可以使用listcomp:

>>> np.array([(labels == i).astype(np.float32) for i in np.arange(3)])
array([[ 0.,  0.,  1.,  1.,  0.],
       [ 1.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  1.]], dtype=float32)

但这并没有真正利用numpy。我们要做的是将每个可能的标签与每个元素进行比较,然后将IOW进行比较

>>> np.arange(3)
array([0, 1, 2])

>>> labels
array([1, 2, 0, 0, 2])

这就是numpy广播的神奇之处。现在,它labels是形状(5,)的一维对象。如果我们将其做成形状为(5,1)的二维对象,则该操作将在最后一个轴上“广播”,并且将获得形状(5,3)的输出,并比较其中的每个条目标签每个元素的范围。

首先,我们可以labels使用None(或np.newaxis)添加一个“额外”轴,更改其形状:

>>> labels[:,None]
array([[1],
       [2],
       [0],
       [0],
       [2]])
>>> labels[:,None].shape
(5, 1)

然后我们可以进行比较(这是我们之前所看的安排的转置,但这并不重要)。

>>> np.arange(3) == labels[:,None]
array([[False,  True, False],
       [False, False,  True],
       [ True, False, False],
       [ True, False, False],
       [False, False,  True]], dtype=bool)
>>> (np.arange(3) == labels[:,None]).astype(np.float32)
array([[ 0.,  1.,  0.],
       [ 0.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 1.,  0.,  0.],
       [ 0.,  0.,  1.]], dtype=float32)

以numpy广播非常强大,值得一读。



 类似资料:
  • 本文向大家介绍关于numpy数组轴的使用详解,包括了关于numpy数组轴的使用详解的使用技巧和注意事项,需要的朋友参考一下 概述 按照图一中aixs=0,对aixs=0上下对应的数据进行相加在学习numpy的时候,最难理解的就是轴的概念,我们知道坐标系中有轴的概念,那么两个轴是否有关联呢?为了便于理解,特写此博客进行梳理。 正文 首先数组的维数比较好理解,下面我们创建一个数组: 打印结果: b 是

  • 问题内容: 在将其标记为重复之前,让我向您解释,我已经阅读了此页面以及许多其他内容,但仍然没有找到解决问题的方法。 这就是我遇到的问题:给定两个2D数组,我想在两个数组上应用函数F。F将两个一维数组作为输入。 请注意,这仅用于演示。这里真正的问题是在两组一维数组上工作的泛型函数F。 向量化要么完全失败,要么出错,或者应用逐个元素的功能,而不是逐个数组(或逐行) 迭代地应用功能;例如,使用上面所定义

  • 问题内容: 我正在努力确切地了解其工作原理。我看了一下文档和一些示例,但看起来似乎并不固定. 这是我们上课的例子: 对于两个数组A和B 我认为可以,但是我不确定(它正在正确处理其中之一的移调吗?)。谁能告诉我这里的实际情况(以及使用时的一般情况)? 问题答案: einsum是做什么的? 假设我们有两个多维数组,A和B。现在假设我们要… 乘 A用B一种特殊的方式来创造新的产品阵列; 然后也许 沿特定

  • 问题内容: 我对熊猫还很陌生,所以我希望这将是一个简单的答案(我也感谢所有指向数据框设置的指针) 假设我有以下DataFrame: 现在,我想按“ gp”分组并获取“ vector”的均值 我试过了 乃至 但我收到一个错误,没有要聚合的“数字类型”。那么np.arrays在熊猫中不起作用吗? 问题答案: 对我来说,它有效: 我取两次平均值,因为您想要向量均值的均值组值(不是吗?)。 如果要使用均值

  • 问题内容: 我正在尝试对复杂的numpy数组进行JSON编码,并且我从astropy找到了一个实用程序(http://astropy.readthedocs.org/en/latest/_modules/astropy/utils/misc.html#JsonCustomEncoder)目的: 这对于复杂的numpy数组非常适用: 作为倾销的收益: 问题是,我无法自动将其读回到复杂的数组中。例如:

  • 我有一个多维数字形状数组(200,1500)。我想可视化此数据的汇总统计数据。因为num_cols太高,我不能全部画出来。我的问题是: > plt.figure(figsize=(20,4))plt.subplot(121) ax=sns.distplot(X[:,1]) plt.subplot(122)plt.xlim(X[:,1]. min()*1.1, X[:,1]. max()*1.1)s