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

相关推荐
庄宝0071 天前
【PYTORCH,TENSORFLOW环境配置,安装,自用代码】
人工智能·pytorch·python·深度学习·conda·numpy·virtualenv
Thetoicxdude1 天前
[Day 21] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
人工智能·numpy·web3.py
鲜于言悠9052 天前
python数据分析——数据分类汇总与统计
大数据·开发语言·python·分类·数据分析·numpy·pandas
麦田里的稻草人w3 天前
【数据分析“三剑客”】—— NumPy
数据挖掘·数据分析·numpy
Uncertainty!!3 天前
Numpy array和Pytorch tensor的区别
pytorch·numpy
小李很执着5 天前
【数学建模】—【Python库】—【Numpy】—【学习】
python·学习·数学建模·numpy
ytusdc7 天前
PIL、cv2、numpy,和pytorch(torch)之间的转换
人工智能·pytorch·numpy
兰色の幻想7 天前
BarTender版软件下载及安装教程
numpy·fastapi·tornado
儒画画画7 天前
【实用软件】Internet Download Manager(IDM6.41)下载及安装教程
numpy·tornado·dash