numpy的array/asarray/asanyarray的格式转化错误问题解决

关于numpy的array()、asarray()、asanyarray()

当前numpy版本:1.26.3

有时一些依赖numpy的旧项目,在运行时,会出现如下错误

ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (2,) + inhomogeneous part

这个ValueError错误通常发生在你尝试将一个序列(比如列表或元组)赋值给一个数组(numpy数组)的元素时,而这个数组元素的大小与序列中的元素数量不匹配。简单来说,就是你试图把一个长度大于1的序列放入一个一维数组的单个位置中,或者试图把一个序列放入一个二维数组的单个位置中,而这个位置应该存放一个与序列长度相同的子序列。

解决办法

降低numpy的版本,这里使用conda直接安装1.23.5的版本

bash 复制代码
conda install numpy==1.23.5

安装完成后,验证一下

py 复制代码
import numpy as np

arr= [[1,2],[1,2,3]]
np.asarray(arr) # 或者使用 asanyarray()

使用时,提示了一下waring

py 复制代码
/tmp/ipykernel_105515/1083838339.py:1: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
  np.asarray(arr)

上面,提示了一个warring,勉强接受了,当然可以再找更旧的numpy版本,应该就不会出现这个问题,比如1.15.0版本的是默认直接转化的,不给任何提示的;

查看一下转化后的数据结构,如下所示,数组的元素转化为了list

bash 复制代码
array([list([1, 2]), list([1, 2, 3])], dtype=object)

新版本的asnumpy、asanynumpy是不支持这种,维度不相同的格式转化,我们最后看看numpy的array()、asarray()、asanyarray()这几个的作用

1、numpy.array()

作用:

numpy.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0) 函数用于创建一个数组。

参数和返回值:

参数:

object:数组的输入数据,可以是列表、元组、其他数组或者其他可迭代对象。

dtype(可选):所需的数组数据类型,可以是字符串、类型对象或者 None。如果未提供,则将根据输入数据推断出数据类型。

copy(可选):如果为 True(默认),则复制输入数据;如果为 False,则尽可能地使用输入数据的视图。

order(可选):创建数组时使用的存储顺序,可以是 'C'(按行存储)或 'F'(按列存储)。

subok(可选):如果为 True,则返回一个与 object 相同类型的子类数组;如果为 False(默认),则返回一个基类数组。

ndmin(可选):生成的数组的最小维度。

返回值:返回一个新的numpy数组。

注意事项:

array 函数用于将输入数据转换为数组。

输入数据可以是列表、元组、其他数组或者其他可迭代对象。

生成的数组的数据类型可以通过 dtype 参数指定,如果未提供,则将根据输入数据推断出数据类型。

可以通过 copy 参数控制是否复制输入数据。如果 copy=True(默认),则复制输入数据;如果 copy=False,则尽可能地使用输入数据的视图。

order 参数用于指定生成数组时的存储顺序。默认情况下,使用 'K',即保持输入数据的存储顺序。可以选择按行存储('C')或按列存储('F')。

subok 参数用于控制返回的数组类型。如果为 True,则返回一个与输入数据相同类型的子类数组;如果为 False(默认),则返回一个基类数组。

ndmin 参数用于指定生成数组的最小维度。默认情况下,数组的维度由输入数据的维度决定。

2、numpy.asarray()

作用:

numpy.asarray(a, dtype=None, order=None) 函数将输入转换为数组。

参数和返回值:

参数:

a:输入数据,可以是列表、元组、其他数组或者其他可迭代对象。

dtype(可选):所需的数组数据类型,可以是字符串、类型对象或者 None。如果未提供,则将根据输入数据推断出数据类型。

order(可选):创建数组时使用的存储顺序,可以是 'C'(按行存储)或 'F'(按列存储)。

返回值:返回一个新的数组

注意事项:

asarray 函数用于将输入数据转换为数组,与 array 函数的功能相似。

输入数据可以是列表、元组、其他数组或者其他可迭代对象。

生成的数组的数据类型可以通过 dtype 参数指定,如果未提供,则将根据输入数据推断出数据类型。

可以通过 order 参数控制生成数组时的存储顺序。默认情况下,使用输入数据的存储顺序。

如果输入数据已经是一个数组,asarray 函数将原样返回,而不是复制数组。

与 array 函数不同,asarray 函数不具有 copy、subok 和 ndmin 参数。

3、numpy.asanyarray()

作用:

numpy.asanyarray(a, dtype=None) 函数将输入转换为 ndarray 对象,但保留子类数组的子类性质。

参数和返回值:

参数:

a:输入数据,可以是列表、元组、其他数组或者其他可迭代对象。

dtype(可选):所需的数组数据类型,可以是字符串、类型对象或者 None。如果未提供,则将根据输入数据推断出数据类型。

返回值:返回一个新的numpy 数组。

注意事项

asanyarray 函数用于将输入数据转换为 ndarray 对象,与 array 函数和 asarray 函数不同的是,它保留了子类数组的子类性质。

输入数据可以是列表、元组、其他数组或者其他可迭代对象。

生成的数组的数据类型可以通过 dtype 参数指定,如果未提供,则将根据输入数据推断出数据类型。

如果输入数据已经是一个数组,asanyarray 函数将原样返回,而不是复制数组。

asanyarray 函数不具有 order 参数。

4、三者的区别

numpy.array 用于创建数组,适用于各种输入数据类型。

numpy.asarray 用于将输入转换为数组,与 array 函数的功能相似,但不具有 copy、subok 和 ndmin 参数。

numpy.asanyarray 用于将输入转换为 ndarray 对象,保留子类数组的子类性质,不具有 order 参数。

内容来源:https://baijiahao.baidu.com/s?id=1769755191352203083\&wfr=spider\&for=pc

相关推荐
竹笋常青20 小时前
《流星落凡尘》
django·numpy
西柚小萌新1 天前
七.numpy模块
numpy
FreedomLeo13 天前
Python数据分析NumPy和pandas(二十三、数据清洗与预处理之五:pandas的分类类型数据)
python·数据分析·numpy·pandas·categoricals·数据分类分析·建模和机器学习
Kalika0-04 天前
NumPy Ndarray学习
python·学习·numpy
上海亚商投顾6 天前
上海亚商投顾:沪指缩量调整 华为概念股午后爆发
numpy
表示这么伤脑筋的题我不会7 天前
请用python写一段训练模型【InsCode AI 创作助手】
python·numpy
緈福的街口8 天前
ValueError: Object arrays cannot be loaded when allow_pickle=False
python·numpy
阿丁小哥9 天前
【Python各个击破】numpy
开发语言·python·numpy
敲代码不忘补水9 天前
Pandas 数据可视化指南:从散点图到面积图的全面展示
python·信息可视化·数据分析·numpy·pandas·matplotlib
人生の三重奏10 天前
numpy——数学运算
开发语言·python·numpy