Python 抛出了numpy.array()异常(很抱歉最初的标题很糟糕)

Python 抛出了numpy.array()异常(很抱歉最初的标题很糟糕),python,numpy,duck-typing,Python,Numpy,Duck Typing,我正在学习Python和numpy,对duck类型的概念还很陌生。我正在编写一些函数,有些东西/某些人应该将numpy数组传递到这些函数中。尝试接受duck类型,我正在编写代码,使用numpy.array和copy=和ndmin=选项将数组或1d/0d数组转换为我需要的形状。具体地说,在可以接受(p,p)数组或标量的情况下,我使用ndmin=选项;标量可以编码为int,(1,)数组,(1,1)数组,[1]列表等 为了解决这个问题,我使用了类似于S=numpy.array(S,copy=False

我正在学习Python和numpy,对duck类型的概念还很陌生。我正在编写一些函数,有些东西/某些人应该将numpy数组传递到这些函数中。尝试接受duck类型,我正在编写代码,使用
numpy.array
copy=
ndmin=
选项将数组或1d/0d数组转换为我需要的形状。具体地说,在可以接受
(p,p)
数组或标量的情况下,我使用
ndmin=
选项;标量可以编码为
int
(1,)
数组,
(1,1)
数组,
[1]
列表等

为了解决这个问题,我使用了类似于
S=numpy.array(S,copy=False,ndmin=2)
的方法来获得一个具有正确
ndim
的数组(如果可能),然后根据需要测试形状。我知道我应该将其嵌入一个Try-Except块中,但是找不到任何关于可能引发何种异常的文档
numpy.array()
。因此,我目前只有以下几点:

# duck covariance matrix into a 2d matrix
try:
    S = numpy.array(S, ndmin = 2, copy=False)
except Exception as e:
    raise e
我应该在这里尝试捕获哪些特定的异常?谢谢。

尝试使用将输入转换为数组。如果输入已经是Numpy数组,则保证不会复制任何内容。如果希望接收
array
子类,请使用
np.asanyarray


请注意,许多Numpy接口并不关心输入是一维还是二维的——例如,
np.dot
可以同时处理一维和二维输入。最好还是保持这种方式——这样,像标量乘法这样的事情就行了。

将函数记录为接受类似数组的对象,并将异常处理留给调用方


numpy.array()
是一个非常宽容的函数,它几乎可以将任何东西转换为数组。

np.asarray
很好,但实际上它只是
np.array
带有
copy=False
。感谢您的澄清!我(显然)不知道这一点。但是,就哪一个用于什么目的而言,在输入参数上使用
asarray
似乎是典型的,而不是
array(…,copy=False)
。(我想这是因为
asarray
稍微简单一点)。@mneonneo:我知道numpy通常不在乎(但是在一些不是2d数组的东西上尝试numpy.trace()或numpy.linalg.det()。对于我的一些用途,我不得不在意。我更喜欢使用
array(…,copy=False)
,因为它与
asarray()相同
,它将隐式文档添加到我的代码中,并显示我完全知道我希望发生什么。@Dr.Drew如果您真的希望只允许数组及其子类,我将首先使用
isinstance(array,np.ndarray)进行明确检查
@seberg:我开始这么做了,但我想用Python来表达我的意图并拥抱鸭子。更重要的是,只要数组输入有意义,我就可以使用。谢谢@J.F。如果numpy真的那么宽容,我就保留通用的raise。@Dr.Drew:我建议完全删除nu周围的try/except块mpy.array().Ah,好的。真的吗?你甚至不会发现并重新抛出相同的错误?@Dr.Drew:是的。这在这里是无用的。顺便说一句,在
except
块中重新抛出异常的正确方法是使用bare
raise
语句。只是为了确保你清楚这一点:1.
ndmin
是最小维度,而不是确切的维度,res结果可能是3D 2。既然你传播了异常,为什么要尝试:…(顺便说一句,这是一个ValueError)谢谢。我强制ndmin至少为2,然后稍后检查S.ndim=2,如果不是,则引发我自己的ValueError。如果引发错误,我会通过附加我自己的消息来引发错误,类似于
raisevalueerror(“输入应为大小为(p,p):%s”%EntComp.\uu doc\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu