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

相关推荐
JOYCE_Leo162 天前
图像处理:使用Numpy和OpenCV实现傅里叶和逆傅里叶变换
图像处理·opencv·numpy
豆豆4 天前
day17 学习笔记
笔记·学习·numpy
杜子腾dd6 天前
21.Excel自动化:如何使用 xlwings 进行编程
运维·python·自动化·excel·numpy·pandas
赛卡7 天前
“自动驾驶背后的数学” 专栏导读
人工智能·pytorch·python·学习·机器学习·自动驾驶·numpy
Cccc吃吃吃8 天前
python中深浅拷贝以及可变对象和不可变对象
开发语言·jvm·python·beautifulsoup·numpy·pyqt·fastapi
豆芽81910 天前
二项式分布(Binomial Distribution)
人工智能·python·机器学习·numpy·概率论
赛卡11 天前
自动驾驶系统的车辆动力学建模:自行车模型与汽车模型的对比分析
python·算法·数学建模·自动驾驶·numpy·matplotlib
夜松云11 天前
线性代数核心概念与NumPy科学计算实战全解析
数据结构·人工智能·python·线性代数·算法·机器学习·numpy
fen_fen11 天前
numpy学习笔记10:arr *= 2向量化操作性能优化
学习笔记·numpy
杜子腾dd12 天前
20. Excel 自动化:Excel 对象模型
运维·python·数据挖掘·自动化·excel·numpy·pandas