2009-04-21 13 views

答えて

95

あまりにも難しいと思ってはいけません。究極的には、個人の精神的健康と長寿のために良いです。

Numpyスカラー型の興味深い状況は、1x1行列をスカラー型に劣化させるための優雅で一貫性のある方法がないという事実のためにありました。数学的には同じものですが、それらは非常に異なるコードで扱われます。

科学的なコードを少しでもやっていたら、最終的にはmax(a)のようなものをすべてのサイズの行列、スカラーでも動作させたいと思うでしょう。数学的には、これは完全に分かりやすいものです。しかし、プログラマーにとっては、これは、Numpyのスカラーには.shapeと.ndim attirbuteがあるはずですので、少なくともufuncsは、Numpyの21種類のスカラー型の入力に対して、明示的な型チェックを行う必要がないことを意味します。

一方、既存のPythonライブラリ()でもスカラー型の明示的な型チェックを行う必要があります。これはジレンマです.Numpy ndarrayはスカラー化されたときに型を個別に変更する必要があり、すべてのアクセスをチェックすることなくその型が発生しているかどうかを知る方法はありません。実際には、そのルートを使うと、おそらくスカラー型の標準で動作するのがちょっと遅くなるでしょう。

Numpyの開発者のソリューションは、ndarrayとPythonスカラーの両方からスカラー型を継承し、すべてのスカラーも.shape、.ndim、.Tなどを持つようにすることです.1x1マトリックスはまだそこにありますがあなたがスカラーを扱うことがわかっているなら、その使用はお勧めできません。なぜa[...]a[()]がすべき理由は本当にありません

>>> from numpy import * 
>>> a = array(1) 
>>> b = int_(1) 
>>> a.ndim 
0 
>>> b.ndim 
0 
>>> a[...] 
array(1) 
>>> a[()] 
1 
>>> b[...] 
array(1) 
>>> b[()] 
1 

を:これは理論的には正常に動作する必要がありますが、時折、あなたはまだ彼らはペイントローラーを逃したいくつかの場所を見ることができた、とすべてが見ることのために醜い内臓が露出しています異なるものを返すが、それはそうである。これを変更するための提案がありますが、1x1アレイの仕事を忘れたようです。

Numpyスカラーが不変である可能性がある、潜在的に解決できない問題である可能性があります。したがって、スカラーをndarrayに「スプレーする」ことは、配列をスカラーに畳み込む随伴操作を数学的に実装することです。

MATLABで
>>> b[0,1,2,3] = 1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'numpy.int32' object does not support item assignment 
>>> b[newaxis] 
array([1]) 

、スカラーの大きさは完全に許容され、愚かです成長している:あなたは、実際に定義によってnewaxisは不思議なことに取り組んでいても、ndarrayにキャストすることができない、numpyのスカラーを育てることができません操作。 Numpyでは、あなたはどこにでもびっくりしなければならないa = array(a)あなたはスカラーで始まり、配列で終わる可能性があります。私はなぜNumpyがPythonでうまくいくのか、この方法でなければならないのか理解していますが、多くの新しいスイッチャーがこれについて深く混乱しているという事実は変わりません。いくつかの人々は、この行動に苦しみ、最終的には忍耐強く覚えている明白な記憶を持っていますが、あまりにも遠く離れている人は、ほとんど無邪気な夢を頻繁に冒す深い形のない精神的傷跡が残ります。すべてにとって醜い状況です。

+21

+1の哲学的紹介:-) –

+3

あなたは書き込み側のキャリアを考えていますか? – KobeJohn

+4

これはたくさんのものを見ているようなmatlabのようです - _ "ナンシースカラーを実際に成長させることはできません" _また、np.arrayを成長させることはできません。サイズを明示的に指定すると、偶発的なO(N^2)動作がより困難になります。 _ "定義上、ndarrayにキャストすることはできません" _ - それはnp.asarray(スカラー)がすることです。 _1x1行列... _ - 本質的に2Dであるか行列として考えるかはここでは役に立たない。 – Eric

4

あなたは少し違ったスカラー配列を作成する必要があります。

>>> x = numpy.float64(1.111) 
>>> x 
1.111 
>>> numpy.isscalar(x) 
True 
>>> numpy.ndim(x) 
0 

それはあなたが純粋に数学的な見地からするために使用することができるものとは少し異なる概念かもしれscalars in numpyのように見えます。私はあなたがスカラーの行列について考えていると思っていますか?

関連する問題