次のような状況では、配列の 1 つに要素として配列が含まれる 2 つの配列を要素単位で乗算します。
>>> import numpy as np
>>> base = np.array( [100., 111.,] )
>>> c = np.array( [9., 11.] )
>>> n0 = np.zeros(len(base))
>>> nn = 3 + n0 # This is the gist of a bunch of intermediate operations
>>> grid = [np.ones(i) for i in nn]
>>> base
array([ 100., 111.])
>>> c
array([ 9., 11.])
>>> nn
array([ 3., 3.])
>>> grid
[array([ 1., 1., 1.]), array([ 1., 1., 1.])]
これまでのところ、すべてが良さそうです。grid
には 2 つの要素があり、それぞれに 3 つの要素があります。私はそれを掛けることができるはずだと感じていますc
>>> a = grid * c
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (2,3) (2)
それは私が望んでいたようにはいきません。エラーは有望です。いくつかの転置トリックを実行して、結果を得ることができます。
a = (grid.T * c).T トレースバック (最新の呼び出しが最後): ファイル ""、1 行目、AttributeError: 'list' オブジェクトに属性 'T' がありません
それは私が予想したよりも見事に失敗します。配列で作業していると思っていましたが、リストがあることがわかりました。私は古き良き昔ながらのブルートフォースで手を試します:
>>> grid_mod = np.array( [np.ones(3), np.ones(3) ] )
>>> grid_mod
array([[ 1., 1., 1.],
[ 1., 1., 1.]])
>>> grid_mod * c
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (2,3) (2)
私はそれがうまくいくと確信していました!最後の要素の後に不要なスペースがあることに気付いたので、それを削除します。
>>> grid_mod2 = np.array( [np.ones(3), np.ones(7)] )
>>> grid_mod2
array([array([ 1., 1., 1.]), array([ 1., 1., 1., 1., 1., 1., 1.])], dtype=object)
>>> grid_mod2 * c
array([array([ 9., 9., 9.]),
array([ 11., 11., 11., 11., 11., 11., 11.])], dtype=object)
その最後のものは期待どおりに機能します。
私の質問は次のとおりです。
grid
結果が配列のリストではなく配列の配列になるように定義するにはどうすればよいですか。- このすべてで実際に何が起こっているのでしょうか? 配列の末尾に余分なスペースがあると、まったく異なる結果が得られるのはなぜですか。
- これについてもっとpythonicな方法はありますか?