有效的方法来制作numpy对象数组实习生字符串

时间:2016-08-29 13:46:45

标签: python numpy

考虑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列表上的大量多余操作。我无法弄清楚如何使它与set一起使用。

建议?

1 个答案:

答案 0 :(得分:2)

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

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