鉴于对@larsmans回答的评论,您可以尝试:
if not isinstance(S, np.ndarray):
raise TypeError("Input not a ndarray")
if S.ndim == 0:
S = np.reshape(S, (1,1))
(p, p2) = S.shape
首先,明确检查S是否是ndarray的(子类).然后,如果需要,可以使用np.reshape复制数据(当然还要重新整形).最后,你得到了维度.
请注意,在大多数情况下,np函数将首先尝试访问ndarray的相应方法,然后尝试将输入转换为ndarray(有时将其保留为子类,如np.asanyarray,有时不会(如np中). asarray(…)).换句话说,使用方法而不是函数总是更有效:这就是我们使用S.shape而不是np.shape(S)的原因.
另一点:np.asarray,np.asanyarray,np.atleast_1D ……都是更通用的函数np.array的特例.例如,asarray将数组的可选复制参数设置为False,asanyarray设置相同并设置subok = True,atleast_1D设置ndmin = 1,atleast_2d设置ndmin = 2 …换句话说,使用np.array总是更容易用适当的论据.但正如一些评论中提到的那样,这是一种风格问题.快捷方式通常可以提高可读性,这始终是一个需要牢记的目标.
在任何情况下,当你使用np.array(…,copy = True)时,你明确地要求提供初始数据的副本,有点像做一个列表([….]).即使没有其他更改,您的数据也将被复制.这具有其缺点的优点(正如我们在法语中所说的那样),例如,您可以将行从第一行C更改为第一列F.但无论如何,您可以获得所需的副本.
使用np.array(input,copy = False),始终会创建一个新数组.如果后者已经是ndarray(也就是说,不浪费内存),它将指向同一块内存作为输入,或者如果输入不是,则将“从头开始”创建一个新内存块.有趣的情况当然是输入是一个ndarray.
在函数中使用此新数组可能会也可能不会更改原始输入,具体取决于函数.您必须检查要使用的函数的文档,以查看它是否返回副本. NumPy开发人员努力限制不必要的副本(遵循Python示例),但有时无法避免.文档应该明确说明发生了什么,如果没有或者不清楚,请提及.
如果出现问题,np.array(…)可能会引发一些异常.例如,尝试使用带有[“STRING”,1]之类的输入的dtype = float将引发ValueError.但是,我必须承认我不记得在所有情况下哪些例外,请相应地编辑这篇文章.