gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:06:44 25 4
gpt4 key购买 nike

考虑 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 一起工作。

建议?

最佳答案

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

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

关于python - 制作 numpy 对象数组实习生字符串的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39207890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com