考虑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
一起使用。
建议?
答案 0 :(得分:2)
这是一种方法,使用一个值等于其键的字典:
seen = {}
for idx, string in enumerate(file):
arr[idx] = seen.setdefault(string, string)