1

私はこのようなものを手に入れようとしています:

def choozer(my_1D_array):
    newArray = np.zeros((len(my_1D_array), 5))
    for x in enumerate(my_1D_array):
        if x[1]<3:
            y = np.array([1,1,1,1,1]) #the y's can be any array of random values
        elif 3<=x[1]<=5:
            y = np.array([2,2,2,2,2])# don't need to be repeated
        elif x[1]>5:
            y = np.array([3,3,3,3,3])
        newArray[x[0]] = y
    return newArray

これは機能します...しかし、私には非常に回りくどいように見えます。効率は私のアプリケーションにとって重要です。だから私はそれをnp.selectと比較するというアイデアを得ました:

def np_choozer(my_1D_array):
    condlist = [my_1D_array<3, 
                np.logical_and((3<=my_1D_array),(my_1D_array<=5)), 
                my_1D_array>5]
    choicelist = [np.array([1,1,1,1,1]),
                  np.array([2,2,2,2,2]),
                  np.array([3,3,3,3,3])]
    return np.select(condlist, choicelist)

...しかしサイコロはありません。軸1に選択リストの値を返します。上記の問題の一般的なバージョンを実行するためのより良い方法はありますか?

前もって感謝します。

4

3 に答える 3

1

多分それはでもっとうまく書くことができますnp.select、しかしあなたはいつでもすることができます:

newArray = np.zeros(my_1D_array.shape + (5,))
newArray[np.where(my_1D_array < 3)] = 1
newArray[np.where((my_1D_array >= 3) & (my_1D_array <= 5)] = 2
newArray[np.where(my_1D_array > 5)] = 3

例:

>>> a = np.random.rand(10) * 10
>>> b = np.empty(a.shape + (5,))
>>> b[np.where(a < 3)] = 1
>>> b[np.where((a >= 3) & (a <= 5))] = 2
>>> b[np.where(a > 5)] = 3
>>> b
array([[ 1.,  1.,  1.,  1.,  1.],
       [ 3.,  3.,  3.,  3.,  3.],
       [ 2.,  2.,  2.,  2.,  2.],
       [ 3.,  3.,  3.,  3.,  3.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 3.,  3.,  3.,  3.,  3.],
       [ 3.,  3.,  3.,  3.,  3.],
       [ 3.,  3.,  3.,  3.,  3.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 3.,  3.,  3.,  3.,  3.]])

編集上記のコードは、割り当てでブロードキャストを利用していますが1、、、2および3は5要素のリストまたは配列に置き換えることができます。a上記の例と同じでb

>>> b[np.where(a < 3)] = np.arange(5)
>>> b[np.where((a >= 3) & (a <= 5))] = np.arange(5) + 10
>>> b[np.where(a > 5)] = np.arange(5) + 20
>>> b
array([[  0.,   1.,   2.,   3.,   4.],
       [ 20.,  21.,  22.,  23.,  24.],
       [ 10.,  11.,  12.,  13.,  14.],
       [ 20.,  21.,  22.,  23.,  24.],
       [  0.,   1.,   2.,   3.,   4.],
       [ 20.,  21.,  22.,  23.,  24.],
       [ 20.,  21.,  22.,  23.,  24.],
       [ 20.,  21.,  22.,  23.,  24.],
       [  0.,   1.,   2.,   3.,   4.],
       [ 20.,  21.,  22.,  23.,  24.]])
于 2013-03-14T23:33:16.640 に答える
0

これ、

import numpy as np

a = np.arange(10)

one = np.ones((5,a.shape[0]))
two = 2 * one
thr = 3 * one

def choozer(a):
    condlist = [a<3, np.logical_and((3<=a),(a<=5)), a>5]
    choicelist = [one,two,thr]
    return np.select(condlist, choicelist).T

print choozer(a)

これを与える、

[[ 1.  1.  1.  1.  1.]
 [ 1.  1.  1.  1.  1.]
 [ 1.  1.  1.  1.  1.]
 [ 2.  2.  2.  2.  2.]
 [ 2.  2.  2.  2.  2.]
 [ 2.  2.  2.  2.  2.]
 [ 3.  3.  3.  3.  3.]
 [ 3.  3.  3.  3.  3.]
 [ 3.  3.  3.  3.  3.]
 [ 3.  3.  3.  3.  3.]]
于 2013-03-15T00:00:06.753 に答える
0

np_choozerの正しい結果が得られmy_1D_array.reshape(-1,1)ます。あなたの助けに感謝します、みんな...私はまだ誰かがより良い方法を思い付くことができるかどうか見ることに興味があります。

于 2013-03-15T01:20:04.080 に答える