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,23可以用 5 元素列表或数组替换。ab上面的示例相同:

>>> 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 回答