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

熊猫文件中的“广播”一词是什么意思?

方航
2023-03-14
问题内容

我正在阅读Pandas文档,“ broadcasting”一词已被广泛使用,但从未真正定义或解释过。

这是什么意思?


问题答案:

因此,术语 广播
来自numpy,简而言之,它解释了您在n维数组(可以是面板,数据框,序列)或标量值之间执行操作时所产生的输出规则。

使用标量值广播

因此,最简单的情况是乘以标量值:

In [4]:
s = pd.Series(np.arange(5))
s

Out[4]:
0    0
1    1
2    2
3    3
4    4
dtype: int32

In [5]:    
s * 10

Out[5]:
0     0
1    10
2    20
3    30
4    40
dtype: int32

并使用数据框获得相同的预期结果:

In [6]:    
df = pd.DataFrame({'a':np.random.randn(4), 'b':np.random.randn(4)})
df

Out[6]:
          a         b
0  0.216920  0.652193
1  0.968969  0.033369
2  0.637784  0.856836
3 -2.303556  0.426238

In [7]:    
df * 10

Out[7]:
           a         b
0   2.169204  6.521925
1   9.689690  0.333695
2   6.377839  8.568362
3 -23.035557  4.262381

因此,从技术上讲,这里的标量值是沿着与上述Series和DataFrame相同的维度 广播 的。

使用一维数组进行广播

假设我们有一个形状为4 x 3(4行x 3列)的2D数据帧,我们可以使用与行长相同长度的1D系列沿x轴执行操作:

In [8]:
df = pd.DataFrame({'a':np.random.randn(4), 'b':np.random.randn(4), 'c':np.random.randn(4)})
df

Out[8]:
          a         b         c
0  0.122073 -1.178127 -1.531254
1  0.011346 -0.747583 -1.967079
2 -0.019716 -0.235676  1.419547
3  0.215847  1.112350  0.659432

In [26]:    
df.iloc[0]

Out[26]:
a    0.122073
b   -1.178127
c   -1.531254
Name: 0, dtype: float64

In [27]:    
df + df.iloc[0]

Out[27]:
          a         b         c
0  0.244146 -2.356254 -3.062507
1  0.133419 -1.925710 -3.498333
2  0.102357 -1.413803 -0.111707
3  0.337920 -0.065777 -0.871822

上面的内容乍看之下很有趣,直到您了解发生了什么,我将值的第一行添加到df中,然后可以使用此图片(源自scipy)将其可视化:

在此处输入图片说明

一般规则是这样的:

为了进行广播,操作中两个阵列的尾轴尺寸必须相同,或者其中之一必须相同。

因此,如果我尝试添加长度不匹配的一维数组,请说一个包含4个元素的数组,与numpy不同,它将ValueError在Pandas中引发a
,您将获得一个充满NaN值的df :

In [30]:
df + pd.Series(np.arange(4))

Out[30]:
    a   b   c   0   1   2   3
0 NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN NaN NaN

现在,关于pandas的一些很棒的事情是,它将尝试使用现有的列名和行标签进行对齐,这可能会妨碍尝试进行如下更漂亮的广播:

在此处输入图片说明

In [55]:
df[['a']] + df.iloc[0]

Out[55]:
          a   b   c
0  0.244146 NaN NaN
1  0.133419 NaN NaN
2  0.102357 NaN NaN
3  0.337920 NaN NaN

在上面,我使用双下标强制将形状设置为(4,1),但是当尝试使用第一行进行广播时,由于列对齐仅在第一列上对齐,因此我们看到一个问题。为了获得与上图所示相同的广播形式,我们必须分解为numpy数组,然后这些数组成为匿名数据:

In [56]:
df[['a']].values + df.iloc[0].values

Out[56]:
array([[ 0.24414608, -1.05605392, -1.4091805 ],
       [ 0.13341899, -1.166781  , -1.51990758],
       [ 0.10235701, -1.19784299, -1.55096957],
       [ 0.33792013, -0.96227987, -1.31540645]])

也可以进行3维广播,但是我并不经常去看那些东西,但是那堆麻木,肮脏和熊猫书中有一些例子说明了它是如何工作的。

一般而言,要记住的事情是,除了简单的标量值外,对于nD数组,短轴/尾轴的长度必须匹配,或者其中之一必须为1。

更新资料

似乎上述情况导致ValueError: Unable to coerce to Series, length must be 1: given 3了最新版本的Pandas0.20.2

所以你要调用.valuesdf第一:

In[42]:
df[['a']].values + df.iloc[0].values

Out[42]: 
array([[ 0.244146, -1.056054, -1.409181],
       [ 0.133419, -1.166781, -1.519908],
       [ 0.102357, -1.197843, -1.55097 ],
       [ 0.33792 , -0.96228 , -1.315407]])

要将其恢复为原始df,我们可以从np数组构造一个df并将args中的原始列传递给构造函数:

In[43]:
pd.DataFrame(df[['a']].values + df.iloc[0].values, columns=df.columns)

Out[43]: 
          a         b         c
0  0.244146 -1.056054 -1.409181
1  0.133419 -1.166781 -1.519908
2  0.102357 -1.197843 -1.550970
3  0.337920 -0.962280 -1.315407


 类似资料:
  • 以下是生成数据帧的代码: 然后我得到了数据帧: 当我键入命令时: 我得到: 根据pandas的引用,axis=1表示列,我希望命令的结果是 所以我的问题是:熊猫的轴是什么意思?

  • 有人能给我指一个链接或解释熊猫索引的好处吗?我经常处理表,并根据列将它们连接起来,而这个连接/合并过程似乎无论如何都要对事物重新编制索引,所以考虑到我认为我不需要这样做,应用索引标准有点麻烦。 关于索引的最佳实践有什么想法吗?

  • 问题内容: 我在pandas中有一个数据框,我试图找出其值的类型。我不确定column的类型是什么。但是,当我跑步时,我得到了; 这是什么意思? 问题答案: 它的意思是: 来源。 第一个字符指定数据的类型,其余字符指定每个项目的字节数,Unicode除外,Unicode将其解释为字符数。项目大小必须与现有类型相对应,否则将引发错误。支持的类型为现有类型,否则将引发错误。支持的种类有:

  • 问题内容: in Pandas中in的功能到底是什么? 问题答案: 当你什么都不懂的时候是你的朋友。它清除了很多次疑问。 看一看: 输出: 当您使用的键将成为新数据框中的索引时。 将列设置为索引时,将获得以下好处: 速度。 当您基于索引列过滤值时,例如 ,因为索引列的散列会更快。不必遍历整个列即可找到。它将只计算的哈希值,并在1 go内找到它。 缓解。 当您可以使用较短和较快的语法,而不是较长和较

  • 问题内容: 在Go规范的包初始化部分中,“词汇文件名顺序”是什么意思? 为了确保可重现的初始化行为,鼓励构建系统以词法文件名的顺序向编译器提供属于同一软件包的多个文件。 问题答案: 从维基百科: 词法顺序是词的字母顺序基于其组成字母的字母顺序的方式的概括。 实际上,这意味着将文件名作为字符串进行比较,使用字符代码确定顺序。英文字母的字符代码顺序遵循字母的自然顺序,但是如果文件名中也包含非字母(例如

  • 在我Linux的主文件夹中,我有几个配置文件,文件扩展名为“rc”: 这些名字中的“rc”是什么意思?

  • 问题内容: 下面的简短bash脚本列出了给定目录及其子目录中的所有文件和目录。脚本中的意思是什么?请给我一些参考。谢谢 问题答案: 这是第一个参数的位置,被视为目录 在bash脚本参数文件传递到脚本(这是脚本的名称),然后,,…要访问所有的人,你既可以使用自己的标签或使用该组的结构之一。对于组构造,有和。(将所有参数视为一个块,并以分隔)

  • setAction()在intent(服务)中做什么 我并不真正理解setAction()的功能,我主要是在“服务到活动的数据传递”示例中找到它的。这根绳子可以自由设置吗?。它到底做什么? 创建广播意图时,除了可选数据和类别字符串之外,它还必须包括一个ACTION STRING。与标准意图一样,数据是使用键值对与意图对象的putExtra()方法一起添加到广播意图中的。可选的类别字符串可以通过调用