【问题标题】:Efficient way to make numpy object arrays intern strings制作numpy对象数组实习生字符串的有效方法
【发布时间】:2016-08-29 13:46:44
【问题描述】:

考虑 object dtype 的 numpy 数组。我可以把任何我想要的东西塞进去。

对我来说,一个常见的用例是将字符串放入其中。但是,对于非常大的数组,这可能会占用大量内存,具体取决于数组的构造方式。例如,如果您将一个长字符串(例如“1234567890123456789012345678901234567890”)分配给一个变量,然后将该变量分配给数组中的每个元素,一切都很好:

arr = np.zeros((100000,), dtype=object)
arr[:] = "1234567890123456789012345678901234567890"

解释器现在在内存中有一个大字符串,以及一个包含指向该对象的指针的数组。

但是,我们也可能做错:

arr2 = np.zeros((100000,), dtype=object)
for idx in range(100000):
    arr2[idx] = str(1234567890123456789012345678901234567890)

现在,解释器在内存中有十万份我的长字符串。不太好。 (当然,在上面的例子中,每次新字符串的生成都会受到阻碍——在现实生活中,想象一下从文件中的每一行读取一个字符串。)

我想要做的是,不是将每个元素分配给字符串,而是首先检查它是否已经在数组中,如果是,则使用与上一个条目相同的对象,而不是新对象。

类似:

arr = np.zeros((100000,), dtype=object)
seen = []
for idx, string in enumerate(file): # Length of file is exactly 100000
    if string in seen:
        arr[idx] = seen[seen.index(string)]
    else:
        arr[idx] = string
        seen.append(string)

(很抱歉没有发布完全运行的代码。希望您能理解。)

不幸的是,这需要对seen 列表进行大量多余的操作。我也不知道如何使它与sets 一起工作。

建议?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    这是一种方法,使用值等于其键的字典:

    seen = {}
    for idx, string in enumerate(file):
        arr[idx] = seen.setdefault(string, string)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 2013-09-30
      • 2016-08-31
      • 2016-12-10
      • 2017-11-16
      • 2019-01-16
      相关资源
      最近更新 更多