解决方案:ValueError: setting an array element with a sequence.
ValueError: setting an array element with a sequence.
报错原因
使用np.asarray()
或np.asanyarray()
函数将对象转换为数组时,如果对象在第一维之后形状不均匀(即内部子序列长度不一致),就会出现该错误。例如将[[1, 2], [3, 4, 5]]
这样的列表转换为数组时,由于内部两个子列表长度不同,会触发错误。部分numpy
版本不会报错,而是发出VisibleDeprecationWarning
警告,提示从参差不齐的嵌套序列创建ndarray
已被弃用。
import numpy as np# 定义一个形状不均匀的列表
ragged_list = [[1, 2], [3, 4, 5]]try:# 尝试使用 np.asarray 转换为数组arr = np.asarray(ragged_list)print(arr)
except ValueError as e:print(f"ValueError: {e}")
在上述代码中,我们定义了一个形状不均匀的列表ragged_list
,当使用np.asarray()
将其转换为数组时,会尝试触发ValueError
异常(不同版本行为可能不同,有的版本会给出警告)。
解决方法
根据错误和警告提示,在使用np.asarray()
或np.asanyarray()
函数时,指定dtype=object
参数,可以避免报错或警告,此时得到的数组元素是包含原始子序列的对象。如果是在np.save()
函数中遇到该问题,由于np.save()
内部会调用np.asanyarray()
,为避免改变内置函数,可在外部将形状不均匀的列表先转换为np.ndarray
(转换时指定dtype=object
),再将转换后的数组传入np.save()
。
使用np.asarray
时指定dtype=object
import numpy as np# 定义一个形状不均匀的列表
ragged_list = [[1, 2], [3, 4, 5]]# 指定 dtype=object 进行转换
arr = np.asarray(ragged_list, dtype=object)
print(arr)
在这个代码中,我们在使用np.asarray()
时指定了 dtype=object
,这样就可以避免报错或警告,成功将形状不均匀的列表转换为数组。
在np.save
中处理形状不均匀列表
import numpy as np# 定义一个形状不均匀的列表
ragged_list = [[1, 2], [3, 4, 5]]# 先将形状不均匀的列表转换为 np.ndarray,指定 dtype=object
arr = np.asarray(ragged_list, dtype=object)# 保存数组到文件
np.save('ragged_array.npy', arr)# 读取保存的文件进行验证
loaded_arr = np.load('ragged_array.npy', allow_pickle=True)
print(loaded_arr)
在使用np.save()
保存形状不均匀列表时的正确处理方式,先将列表转换为指定dtype=object
的数组,再进行保存,最后读取文件验证结果。
有时候和numpy版本也有关系