Numpy: バグ:np.arrayは、部分的に一致する次元を持つ配列のリストで失敗します

作成日 2016年03月23日  ·  8コメント  ·  ソース: numpy/numpy

関数numpy.arrayとnumpy.asarrayは、配列のリストに適用されたときに明確に定義された動作をします。リストされた配列の次元とサイズが同じである場合、リストは結果の配列の次元の1つになります(「モード1 ")。 そうでない場合は、配列の配列が返されます(「モード2」)。

ただし、「モード2」でのnumpy.arrayとnumpy.asarrayの動作は、配列内のアイテムの数に依存しているようです。 次のコードは、numpyの有用性に比べてあまりエレガントではありませんが、機能します。

>>> a = np.array([1, 2, 3])
>>> b = np.array([[1, 0], [0, 1]])
>>> np.asarray([a, b])
array([array([1, 2, 3]), array([[1, 0],
       [0, 1]])], dtype=object)

しかし、以下はそうではありません:

>>> a = np.array([1, 2])
>>> b = np.array([[1, 0], [0, 1]])
>>> np.asarray([a, b])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.4/dist-packages/numpy/core/numeric.py", line 474, in asarray
    return array(a, dtype, copy=False, order=order)
ValueError: could not broadcast input array from shape (2,2) into shape (2)

明らかに、問題は、numpy.asarrayが最初の次元がabで同じ長さであることを確認すると、「モード1」に移行しようとすることです。これはここでは不可能です。

編集:私はnumpy1.10.4とpython3.4.3を使用しています。

00 - Bug numpy.core

最も参考になるコメント

dtype=objectしても、役に立ちません。それでも同じエラーが発生します。
ただし、空の配列を追加すると、それを回避できます。

arr_of_arr = np.array([np.array([]), a, b])[1:]

全てのコメント8件

同意しましたが、この種のフォールバックロジックは残念です。 dtypeが明示的に指定されていない限り、 dtype=object配列を作成しないことについて説明しました。 IMO np.array([a, b], dtype=object)は、これらのいずれかを作成する唯一の方法である必要があります。また、形状をチェックする必要はありません。

dtype=objectしても、役に立ちません。それでも同じエラーが発生します。
ただし、空の配列を追加すると、それを回避できます。

arr_of_arr = np.array([np.array([]), a, b])[1:]

1.14.4にまだ存在します

@ ppwwyyxx-確かに、それは些細な変更ではないので、部分的には常に打撃を受けるものではないので、緊急性は比較的低いです(そして貢献する時間のある人はそれほど多くありません...)。

しかし、ここで役立つ可能性があるのは、望ましい動作が何であるかを正確に明確にすることです。 @shoyerは、実際に必要な場合はdtype=objectを明示的に要求するという長年の要求にも言及しました。それ以外の場合は、数値配列または文字列配列として解析できないものに対してTypeErrorを発生させます(#5353)。 私は最近、 dtype='structured'を同様に持つことが有用かどうかを考えています。これにより、配列の要素を示すリストと構造化されたdtypeの要素としてのタプルの違いが厳密に強制されます。

誰かが私に何をすべきかについてのいくつかの指針を送ってくれるなら、私は貢献したいと思っています。 ctors.cの関連コードをちらっと見たところ、コンストラクタロジックは、さまざまな形式の入力を処理する必要があるため、非常に複雑に見えます。

同じ問題:#8330

これは#11601で修正されるかもしれないと思います。 編集:そうではありません。

したがって、ここで起こっていることは大まかに:

a = np.array([1, 2])
b = np.array([[1, 0], [0, 1]])
out = np.asarray([a, b])
# translates to
out = np.empty((2, 2))  #shape is correctly inferred
out[0,:] = a
out[1,:] = b  # error comes from here
このページは役に立ちましたか?
0 / 5 - 0 評価