【发布时间】: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 一起工作。
建议?
【问题讨论】: