如何将BigQuery获取的列表格式向量转为numpy数组用于计算?
解决从BigQuery向量列转numpy数组的问题
嘿,我之前也踩过这个坑!从BigQuery拉回来的page_vector列看起来是列表格式,但直接用apply转numpy数组就是不生效,多半是数据结构或者隐性类型的问题,咱们一步步捋清楚解决:
第一步:先搞清楚数据的真实情况
先别着急转数组,先看看你的向量到底是什么样的:
# 打印第一个元素的类型和具体内容 print(type(df['page_vector'].iloc[0])) print(df['page_vector'].iloc[0])
这一步能帮你排查:
- 是不是嵌套列表?比如每个元素是
[[1.0,2.0]]而不是[1.0,2.0] - 是不是混了非数值类型?比如字符串形式的数字或者
None空值 - 会不会其实是JSON字符串?比如看起来像列表但实际是
"[1.0,2.0]"这样的字符串
第二步:针对性解决问题
根据上面的排查结果,对应不同的解决方案:
情况1:是正常的数值列表,但apply没生效
这种情况最常见,直接把整个列转成二维列表再转numpy数组比apply更靠谱:
import numpy as np # 把列转成二维列表,再直接转numpy数组 vector_array = np.array(df['page_vector'].tolist())
转完之后vector_array就是二维numpy数组了,直接可以用来计算均值、余弦相似度:
# 计算所有向量的均值 vector_mean = np.mean(vector_array, axis=0) # 计算余弦相似度矩阵(需要导入sklearn) from sklearn.metrics.pairwise import cosine_similarity similarity_matrix = cosine_similarity(vector_array)
情况2:列表里有嵌套/空值/非数值元素
如果发现有嵌套(比如[[1.0,2.0]])或者空值None,先清理再转:
# 处理嵌套+空值的情况 df['page_vector'] = df['page_vector'].apply( lambda x: np.array(x[0], dtype=float) if isinstance(x, list) and len(x) > 0 else np.nan ) # 过滤掉含空值的行(如果不需要保留) df_clean = df.dropna(subset=['page_vector']) # 转成二维数组 vector_array = np.array(df_clean['page_vector'].tolist())
如果是字符串形式的数字(比如['1.0','2.0']),就先把每个元素转成float:
df['page_vector'] = df['page_vector'].apply( lambda x: np.array([float(num) for num in x], dtype=float) if x is not None else np.nan )
情况3:返回的是JSON字符串而非列表
有时候BigQuery客户端会把数组序列化成JSON字符串,这时候需要先解析:
import json df['page_vector'] = df['page_vector'].apply( lambda x: np.array(json.loads(x), dtype=float) if x is not None else np.nan ) vector_array = np.array(df['page_vector'].tolist())
最后验证结果
转完之后可以确认一下:
print(vector_array.shape) # 应该是(n_samples, vector_dimension)的格式 print(type(vector_array)) # 输出<class 'numpy.ndarray'>
没问题的话就可以放心做后续的均值、余弦相似度计算啦!
内容的提问来源于stack exchange,提问作者dendog
相关产品推荐
相关产品推荐

