多くの数値配列計算を必要とする Python のプロジェクトに取り組んでいます。残念ながら (または、幸いなことに、あなたの視点によっては)、私は Python を初めて使用しますが、MATLAB と Octave プログラミング (それ以前は APL) を何年も行ってきました。私は、すべての変数が自動的に行列 float に型付けされることに非常に慣れており、入力型をチェックすることにまだ慣れています。
私の関数の多くでは、入力 Snumpy.ndarray
が size(n,p)
である必要があるため、 type(S) がであることをテストしnumpy.ndarray
、値を取得する必要があります(n,p) = numpy.shape(S)
。潜在的な問題の 1 つは、入力が list/tuple/int/etc になる可能性があることです。別の問題は、入力が shape ()
:の配列になる可能性があることですS.ndim = 0
。変数の型を同時にテストし、問題を修正してS.ndim = 0
から、次のようにディメンションを取得できることに気づきました。
# first simultaneously test for ndarray and get proper dimensions
try:
if (S.ndim == 0):
S = S.copy(); S.shape = (1,1);
# define dimensions p, and p2
(p,p2) = numpy.shape(S);
except AttributeError: # got here because input is not something array-like
raise AttributeError("blah blah blah");
それは機能しますが、これが有効なことなのだろうか?ndim のドキュメント文字列は言う
まだ ndarray でない場合は、変換が試行されます。
そして、numpy が int/tuple/list を配列に簡単に変換できることは確かにわかっているので、numpy がこれを行う必要があるのに、なぜこれらの型の入力に対して AttributeError が発生するのか混乱しています
numpy.array(S).ndim;
これはうまくいくはずです。