【问题标题】:Generate repeated sequence of integers while adding an offset after each repeat生成重复的整数序列,同时在每次重复后添加偏移量
【发布时间】:2017-02-16 20:59:05
【问题描述】:

我正在尝试创建一个整数序列,该序列重复列表中的元素多次,同时在每次重复后为它们添加一个常量偏移量。

我有一个 pandas 数据框,其中有许多列是关于同一 N 个人的重复信息块。例如,列可以是 [age1, age2, age3, ... ageN, height1, height2, height3, ... heightN, ... ],我想要与个人 1 和 4 相关联的列(例如)。我想为特定个人生成列索引,以便可以使用df.iloc[:, cindices] 对数据框进行子集化。

以下代码有效,但它非常难看,我希望有一个更清晰、更清晰的解决方案(更 Pythonic)。

subjects = [1, 4]
N = 11; repeats = 3
columns = np.array([(np.arange(repeats) * N + i) for i in subjects])
cindices = columns.T.flatten()

# Information for individuals 1 & 4 are in these columns:
>> array([ 1,  4, 12, 15, 23, 26])

【问题讨论】:

    标签: python pandas numpy sequence repeat


    【解决方案1】:

    这是您的解决方案的numpythonic 版本

    (np.array(subjects)[None, :] + N*np.arange(repeats)[:, None]).ravel()
    

    [None, :] 不是绝对必要的,但为了清楚起见,我把它留了下来。

    这里发生的是broadcasting,如果您将启用 numpy 的运算符(例如 +)应用于形状为 (1, 2) 和 (3, 1) 的数组,numpy 将返回 (3, 2) 数组与单元格中的“正确”总和。

    ravel 将数组展平。

    【讨论】:

    • 或者简单地说:(subjects + N*np.arange(repeats)[:,None]).ravel().
    • @Divakar 是的,我正要讨论这个 ;-)
    • 对两者都投赞成票。两个非常短的解决方案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 2021-11-03
    • 2014-05-07
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    相关资源
    最近更新 更多