0

xサイズ変更されていない、たとえば、サイズ変更されている可能性のある数値パラメーターx = 1、リスト、タプル、またはndarrayなどを受け入れる関数を作成したいと思いますx = np.array([1,2])。両方のケースを処理するコードを書く良い方法はありますか?

具体的な例として、が単なる数値の場合はx(事前定義された形状のxshape)配列にブロードキャストし、が間違った形状の配列の場合はエラーを返すことが目標であるとします。xx

import numpy as np
import sys

if np.shape(np.atleast_1d(x)) == (1,):
    x = np.ones(xshape) * x
elif np.shape(x) != xshape:
    sys.exit("wrong shape for x")

上記のコードは、ネストの問題を除けば、機能しているようですx = [[2]]。また、などの推奨される方法に反しているようtry / exceptです。任意の提案をいただければ幸いです。

4

1 に答える 1

0

これを行う 1 つのアプローチは、さまざまなケースをすべて処理し、複雑さを隠してくれる numpy に従うことです。例えば:

>>> import numpy as np
>>> xshape = (2,)
>>> np.ones(xshape) * 1
array([ 1.,  1.])
>>> np.ones(xshape) * [9, 8]
array([ 9.,  8.])
>>> np.ones(xshape) * [[9, 8]]
array([[ 9.,  8.]])
>>> # Wrong shape
>>> np.ones(xshape) * [[9, 8, 7]]
ValueError                                Traceback (most recent call last)
<ipython-input-28-dd8a3b87c22c> in <module>()
----> 1 np.ones(xshape) * [[9, 8, 7]]

ValueError: operands could not be broadcast together with shapes (2) (1,3) 

別の関連するアプローチはx = np.aarray(x)、関数/スクリプトの先頭で使用することです。がすでに配列である場合xは何も起こりませんが、 がxスカラーまたはシーケンスである場合は、適切な形状の配列が作成され、それが配列であることを認識して残りのコードを記述できますx(配列xに変換できない場合は、エラーが発生します)。

于 2013-02-02T00:10:58.890 に答える