【问题标题】:Conditionally add 1 to int element of a NumPy record array有条件地将 1 添加到 NumPy 记录数组的 int 元素
【发布时间】:2013-12-13 09:42:02
【问题描述】:

我有一个 2.5 亿行乘 9 列的大型 NumpPy 记录数组 (MyLargeRec)。如果该行的索引在另一个列表或 300,000 个整数(MyList)中,我需要将 1 添加到第 7 列(dtype =“int”)。如果这是一个普通的 python 列表,我会使用下面的简单代码...

for m in MyList:
    MyLargeRec[m][6]+=1

但是,我似乎无法使用 NumPy 记录数组获得类似的功能。我尝试了一些选项,例如 nditer,但这不会让我选择我想要的特定索引。

现在你可能会说这不是 NumPy 的设计目的,所以让我解释一下我为什么使用这种格式。我使用它是因为从头开始构建记录数组只需要 30 分钟,而如果使用传统的 2D 列表格式则需要 24 小时以上。我昨天花了所有的时间试图找到一种方法来做到这一点,但我最终将它转换为一个列表,使用...

MyLargeList = list(MyLargeRec)

所以我可以使用上面的简单代码来实现我想要的,但是执行此功能需要 8.5 小时。

因此,谁能先告诉我,有没有一种方法可以在 NumPy 记录数组中实现我想要的?其次,如果没有,关于 python 2.7 中创建、更新和存储如此大的二维矩阵的最佳方法的任何想法?

非常感谢

汤姆

【问题讨论】:

    标签: python arrays numpy add record


    【解决方案1】:
    your_array[index_list, 6] += 1
    

    Numpy 允许您构建一些非常整洁的切片。这将选择索引列表中所有行的第 6 列,并为每列加 1。 (请注意,如果一个索引在您的索引列表中出现多次,这仍然只会将 1 添加到相应的单元格中。)

    【讨论】:

    • 这看起来确实很整洁,但是它一直给我一个错误“数组索引太多”。也确实存在多个索引,这些也需要计算在内。但是,将其修改为我上面的 for 循环的原始格式似乎已经奏效。我不知道为什么这以前不起作用。不过感谢您的帮助,这让我走上了正轨。
    • 如果您将示例输入作为可运行的 Python 代码提供,将会有所帮助。具体来说,使用适当数量的维度创建MyLargeRecMyList。否则,在回答您的问题时会涉及很多猜测,这会导致大量时间浪费。以下是提供示例输入的问题示例:stackoverflow.com/q/19731022/553404
    【解决方案2】:

    这段代码...

    for m in MyList:
        MyLargeRec[m][6]+=1
    

    确实有效,我的愚蠢问题。

    【讨论】:

    • MyLargeRec 的形状和 dtype 是什么?
    猜你喜欢
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    相关资源
    最近更新 更多