0

この問題があります:

私のソフトウェアでは、単一の配列または 3 つの配列のリスト (ピクセル化されたスカイ マップの 1 つまたは 3 つのコンポーネント) を扱っています。

単一の配列が 1 つの配列のリストである場合、要素の数に関係なく、透過的に反復するのは非常に簡単です。

さて、これらのマップを二乗したいとしましょう:

my_map = np.ones(100) # case of single component
# my_map = [np.ones(100) for c in [0, 1, 2]] # case of 3 components

if isinstance(my_map, list): #this is ugly
    my_map_2 = [m**2 for m in my_map]
else:
    my_map = my_map ** 2

これを改善する方法について何か提案はありますか?

4

3 に答える 3

0

単一の値の場合は、戻り値をリストに変換できます。 list() ファクトリ メソッドを使用します。

my_map = []
temp = np.ones(100) # case of single component
# Append your temp value.. either single or a list to your empty list..
my_map.append(temp)
my_map_2 = [m**2 for m in my_map]

メソッドnp.ones(100)が単一の値とリストを返す可能性があると思います..

于 2012-10-01T19:51:55.263 に答える
0

2D 配列を直接作成しないのはなぜですか?

my_array = np.ones((100,3), dtype=float)

そうすれば、「3 つの」配列を一度に直接二乗できます。個々の要素には引き続き次のようにアクセスできます。

(x, y, z) = my_array.T

はメソッド.Tのショートカットです.transpose

このアプローチを使用すると、特に同じ関数を 3 つの配列に適用する場合は、リストをループするよりもはるかに効率的です。たとえば、最初の配列を 2 乗し、2 番目の配列を 2 倍にして、3 番目の配列の平方根を取得したい場合でも、次のようにすることができます。

my_array[:,0] **=2
my_array[:,1] *=2
my_array[:,2] **=0.5
于 2012-10-01T20:06:53.760 に答える
0

試しましたnumpy.asarrayか?その場合、if-else は次のようになります。

my_map = numpy.asarray(my_map)**2

numpy.asanyarrayまた、ndarray のサブクラスも処理したい場合はチェックしてください。

関数の先頭に呼び出しを入れることが多いnumpy.asarrayので、それらはリストと配列の両方で機能します。

于 2012-10-02T18:20:44.107 に答える