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

相关推荐
黎明沐白2 天前
PyTorch源码编译报错“fatal error: numpy/arrayobject.h: No such file or directory”
人工智能·pytorch·numpy
NorthFish北海有鱼2 天前
python三维矩阵的维度
python·矩阵·numpy
浅浅2804 天前
numpy、pandas内存优化操作整理
数据结构·经验分享·python·学习·性能优化·numpy·pandas
帮帮志4 天前
07.Python代码NumPy-排序sort,argsort,lexsort
numpy
秋凉花落4 天前
课堂总结。
numpy
架构师那点事儿4 天前
人工智能基础-NumPy-向量矩阵数组库
人工智能·python·numpy
跟着杰哥学Python5 天前
一文读懂Python之numpy模块(34)
开发语言·python·numpy
热爱编程的OP9 天前
Numpy常用库方法总结
开发语言·python·numpy
ljd21032312412 天前
numpy练习
numpy
满怀101512 天前
【NumPy科学计算引擎:从基础操作到高性能实践】
开发语言·python·numpy