75

確かに0d配列はスカラーですが、Numpyはそうは思わないようです...何かが足りないのでしょうか、それとも概念を誤解しているだけでしょうか?

>>> foo = numpy.array(1.11111111111, numpy.float64)
>>> numpy.ndim(foo)
0
>>> numpy.isscalar(foo)
False
>>> foo.item()
1.11111111111
4

2 に答える 2

153

それについてあまり深く考えるべきではありません。それは最終的には個人の精神的健康と長寿にとってより良いものです。

Numpyスカラー型の奇妙な状況は、1x1行列をスカラー型に劣化させる優雅で一貫した方法がないという事実から生まれました。数学的には同じものですが、非常に異なるコードで処理されます。

科学的なコードをいくらでも実行している場合、最終的にはmax(a)、スカラーを含むすべてのサイズの行列で作業するようなものが必要になります。数学的には、これは完全に賢明なことです。ただし、プログラマーにとって、これは、Numpyにスカラーを提示するものはすべて.shapeと.ndimの属性を持つ必要があることを意味します。したがって、少なくともufuncは、Numpyで可能な21のスカラー型の入力に対して明示的な型チェックを行う必要はありません。

一方、スカラー型で明示的な型チェックを行う既存のPythonライブラリでも機能するはずです。これはジレンマです。Numpyndarrayは、スカラーに縮小されたときにそのタイプを個別に変更する必要があり、すべてのアクセスをチェックしない限り、それが発生したかどうかを知る方法はありません。実際にそのルートを進むと、スカラー型の標準での作業が途方もなく遅くなる可能性があります。

Numpy開発者の解決策は、ndarrayとPythonの両方のスカラーから独自のスカラー型を継承することです。これにより、すべてのスカラーにも.shape、.ndim、.Tなどが含まれます。1x1行列は引き続き存在しますが、その使用は次のようになります。スカラーを扱うことがわかっている場合はお勧めしません。これは理論的には問題なく機能するはずですが、ペイントローラーで見落とした場所がいくつか見られることがあり、醜い内臓がすべての人に見えるようになっています。

>>> 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

理由は本当にありませんa[...]a[()]、別のものを返す必要がありますが、そうです。これを変更する提案がありますが、1x1アレイの作業を完了するのを忘れているようです。

潜在的に大きく、おそらく解決できない問題は、Numpyスカラーが不変であるという事実です。したがって、スカラーをndarrayに「スプレー」することは、数学的には配列をスカラーに折りたたむという随伴作用であり、実装するPITAです。Numpyスカラーを実際に成長させることはできませんnewaxis。不思議なことに機能していても、定義上、ndarrayにキャストすることはできません。

>>> 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])

Matlabでは、スカラーのサイズを大きくすることは、完全に受け入れられ、頭の悪い操作です。Numpyでは、スカラーで始まり配列で終わる可能性があると思わa = array(a)れるすべての場所で不快感を覚える必要があります。NumpyがPythonでうまく機能するためにこの方法でなければならない理由は理解していますが、それでも多くの新しいスイッチャーがこれについて深く混乱しているという事実は変わりません。一部の人はこの行動に苦しみ、最終的には忍耐強くなるという明確な記憶を持っていますが、あまりにも遠くにいる人は一般に、最も罪のない夢を頻繁に悩ませる深い形のない精神的な傷跡を残しています。それはすべての人にとって醜い状況です。

于 2009-04-27T18:55:32.490 に答える
6

スカラー配列を少し異なる方法で作成する必要があります。

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

numpyのスカラーは、純粋に数学的な観点からは、慣れているものとは少し異なる概念であるように見えます。スカラー行列の観点から考えていると思いますか?

于 2009-04-21T15:20:27.110 に答える