Python 抛出了numpy.array()异常(很抱歉最初的标题很糟糕)
我正在学习Python和numpy,对duck类型的概念还很陌生。我正在编写一些函数,有些东西/某些人应该将numpy数组传递到这些函数中。尝试接受duck类型,我正在编写代码,使用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
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
块中重新抛出异常的正确方法是使用bareraise
语句。只是为了确保你清楚这一点:1.ndmin
是最小维度,而不是确切的维度,res结果可能是3D 2。既然你传播了异常,为什么要尝试:…(顺便说一句,这是一个ValueError)谢谢。我强制ndmin至少为2,然后稍后检查S.ndim=2,如果不是,则引发我自己的ValueError。如果引发错误,我会通过附加我自己的消息来引发错误,类似于raisevalueerror(“输入应为大小为(p,p):%s”%EntComp.\uu doc\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu