You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传入一维数组仍报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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:02:42