如何高效创建几十万条数据的(n,786)维度2D NumPy数组?
嘿,这个问题我太熟了!处理几十万条数据的时候,千万别用Python层面的循环一条一条填充,那速度能慢到让你怀疑人生。下面给你几个高效的解决方案,亲测好用:
方案1:直接用
np.array()提取嵌入(最推荐) 你的元组列表里每个元素的第二个值就是786维的嵌入,直接用列表推导式把所有嵌入抽出来,再转成NumPy数组就行。这个方法的核心是利用列表推导式的高效性,加上NumPy底层C实现的数组转换,速度非常快。
代码示例:
import numpy as np # 假设你的元组列表叫 sentence_embeddings_list embeddings_array = np.array([emb for _, emb in sentence_embeddings_list])
如果想进一步节省内存,可以指定数据类型(比如嵌入是float32的话):
embeddings_array = np.array([emb for _, emb in sentence_embeddings_list], dtype=np.float32)
方案2:用
np.vstack()(适合嵌入已经是NumPy数组的情况) 如果每个sentence_embedding_n本身已经是1D NumPy数组,那用np.vstack()拼接也很高效:
embeddings_array = np.vstack([emb for _, emb in sentence_embeddings_list])
不过如果你的嵌入是普通列表,方案1的np.array()会更直接,因为vstack内部也要做类似的类型转换。
方案3:预分配数组(极端大数量场景备用)
如果数据量突破百万级,担心列表推导式占用过多临时内存,可以先预分配好数组,再批量填充(不过几十万的话其实方案1完全足够):
n = len(sentence_embeddings_list) # 提前指定形状和数据类型,减少内存波动 embeddings_array = np.empty((n, 786), dtype=np.float32) # 这里的循环虽然是Python层面,但因为只是赋值操作,比逐个append快很多 for idx, (_, emb) in enumerate(sentence_embeddings_list): embeddings_array[idx] = emb
额外提醒
- 确保所有嵌入的数据类型一致,不然NumPy会自动升级到更高精度的类型(比如float64),平白浪费内存。
- 几十万条786维的float32数组,内存占用大概是 100000 * 786 * 4 ≈ 314MB,现代机器完全hold住,不用怕内存不够。
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

