小编P.J*_*.Jo的帖子

在 DataFrame 的布尔切片上设置时进行广播会产生奇怪的结果

考虑以下代码:

import numpy as np
import pandas as pd

df = pd.DataFrame(
    {"AAA": [4, 5, 6, 7], "BBB": [10, 20, 30, 40], "CCC": [100, 50, -30, -50]}
)

df[[True, False, False, True]] = np.array([2,5]).reshape(2,1) 
df
   AAA  BBB  CCC
0    2    2    2
1    5   20   50
2    6   30  -30
3    5    5    5
Run Code Online (Sandbox Code Playgroud)

这将广播应用于数据帧,并导致第一行仅包含值 2,第四行仅包含值 5。正如我所料。现在,我只需向 df 添加一列并应用类似的转换:

df["logic"] = 9

df[[True, False, False, True]] = np.array([3,7]).reshape(2,1)

Run Code Online (Sandbox Code Playgroud)

我现在得到的不是提供仅包含 3 的第一行和仅包含 7 的最后一行

ValueError:使用 ndarray 设置时必须具有相等的 len 键和值

有人可以解释一下,为什么会发生这种情况?

python pandas array-broadcasting

5
推荐指数
1
解决办法
75
查看次数

使用复合文字数组初始化的指针数组

我目前正在阅读《理解使用 C 指针》一书,我偶然发现了以下示例:

int (*(arr1[])) = {(int[]){0,1,2}, (int[]) {3,4,5}, (int[]){6,7,8}}
Run Code Online (Sandbox Code Playgroud)

然后作者展示了 arr1[0][0]...arr1[2][2] 的内存布局,可以看到元素存储在连续的区域中。

关于这个例子我有两个问题:

  1. 我不明白为什么arr1的声明中的第一个括号是必要的,即与以下声明有区别吗:
int *(arr1[]) = ...
Run Code Online (Sandbox Code Playgroud)

我将其读为: arr1 被声明为包含指向 int 的指针的数组。

  1. 我真的不明白为什么这个例子会产生一个连续的块。因为:如果我初始化一个数组,我会写
a = {...}
Run Code Online (Sandbox Code Playgroud)

并列出以逗号分隔的元素。现在,在前面的示例中,arr1 的元素应该是指针(除非我对声明的理解是错误的)。因此,我认为对于第一个成员

int *(arr1[])= {(int[]){0,1,2},...
Run Code Online (Sandbox Code Playgroud)

创建一个包含 0,1,2 的数组,然后返回其地址(这对应于转换为 int[])并将其用作第一个指针的值。然而,如果这是真的,那么数字 0、1、2 可能位于与数字 3、4、5 不同的内存段中。

有人可以进一步解释一下吗?

c pointers

3
推荐指数
1
解决办法
79
查看次数

标签 统计

array-broadcasting ×1

c ×1

pandas ×1

pointers ×1

python ×1