传入一维数组仍报TypeError: iteration over a 0-d array错误的原因
问题:从DataFrame提取嵌入向量计算余弦相似度时报错
问题场景
现有名为new_df的DataFrame,数据如下:
Unnamed: 0 Words embedding 0 0 Elephant [-0.017855134320424067, -0.008739002273680945,... 1 1 Lion [-0.001514446088710819, -0.010011047775235734,... 2 2 Tiger [-0.013417221828848814, -0.009594874215361255,... 3 3 Dog [-0.0009933243881749651, -0.015114395874422861... 4 4 Cricket [0.003905495127549335, -0.0072066829816015395,... 5 5 Footbal [-0.011442505362835323, -0.008127146122306163,...
执行以下代码提取嵌入向量并计算余弦相似度:
text_embedding = new_df["embedding"][1] import numpy as np def cosine_similarity(A, B): # Calculate dot product dot_product = sum(a*b for a, b in zip(A, B)) # Calculate the magnitude of each vector magnitude_A = sum(a*a for a in A)**0.5 magnitude_B = sum(b*b for b in B)**0.5 cosine_similarity = dot_product / (magnitude_A * magnitude_B) print(f"Cosine Similarity using standard Python: {cosine_similarity}") array1 = np.array(new_df['embedding'][0]) array2 = np.array(text_embedding) cosine_similarity(array1,array2)
运行后触发错误:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[13], line 29 25 array2 = np.array(text_embedding) 27 #print(array1) 28 #print(array2) ---> 29 cosine_similarity(array1,array2) 31 #cosine_similarity([1,2,3,1,1,2,2,2,2,2,2,3,2,2,2,2,2],[1,2,3,1,1,2,2,2,2,2,2,5,2,2,2,2,2]) 32 33 #df Cell In[13], line 10, in cosine_similarity(A, B) 7 def cosine_similarity(A, B): 8 9 # Calculate dot product ---> 10 dot_product = sum(a*b for a, b in zip(A, B)) 12 # Calculate the magnitude of each vector 13 magnitude_A = sum(a*a for a in A)**0.5 TypeError: iteration over a 0-d array
但手动传入列表时函数能正常执行:
cosine_similarity([1,2,3,1,1,2,2,2,2,2,2,3,2,2,2,2,2],[1,2,3,1,1,2,2,2,2,2,2,5,2,2,2,2,2])
问题原因
核心问题是DataFrame的embedding列存储的不是Python列表,而是字符串形式的"列表"。当你执行np.array(new_df['embedding'][0])时,得到的不是一维数值数组,而是一个0维的字符串数组(整个列表字符串作为单个元素)。这种数组无法被zip迭代,从而触发TypeError: iteration over a 0-d array。
而手动传入的是真正的Python列表,zip可以正常迭代其中的元素,所以函数能正常运行。
解决方案
方案1:将字符串形式的列表转换为真正的Python列表
使用ast.literal_eval解析字符串,把它转换成实际的列表对象:
import ast # 处理embedding列,将字符串转为列表 new_df['embedding'] = new_df['embedding'].apply(ast.literal_eval) # 之后再提取并转数组 array1 = np.array(new_df['embedding'][0]) array2 = np.array(new_df['embedding'][1]) cosine_similarity(array1, array2)
方案2:修改余弦相似度函数,适配numpy数组
直接使用numpy的内置方法计算,避免手动迭代数组元素,同时提升计算效率:
import numpy as np def cosine_similarity(A, B): dot_product = np.dot(A, B) magnitude_A = np.linalg.norm(A) magnitude_B = np.linalg.norm(B) cos_sim = dot_product / (magnitude_A * magnitude_B) print(f"Cosine Similarity using numpy: {cos_sim}") # 若embedding列已转为列表,直接转数组计算 array1 = np.array(new_df['embedding'][0]) array2 = np.array(new_df['embedding'][1]) cosine_similarity(array1, array2)
如果不想提前处理embedding列,也可以在提取时直接解析字符串:
import ast array1 = np.array(ast.literal_eval(new_df['embedding'][0])) array2 = np.array(ast.literal_eval(new_df['embedding'][1])) cosine_similarity(array1, array2)
内容的提问来源于stack exchange,提问作者Karan
相关产品推荐
相关产品推荐

