関数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が最初の次元がa
とb
で同じ長さであることを確認すると、「モード1」に移行しようとすることです。これはここでは不可能です。
編集:私はnumpy1.10.4とpython3.4.3を使用しています。
同意しましたが、この種のフォールバックロジックは残念です。 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
最も参考になるコメント
dtype=object
しても、役に立ちません。それでも同じエラーが発生します。ただし、空の配列を追加すると、それを回避できます。