Python Numpy:np.select用于给定标量条件列表的一维数组

Python Numpy:np.select用于给定标量条件列表的一维数组,python,performance,numpy,Python,Performance,Numpy,我想得到这样的东西: 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]<

我想得到这样的东西:

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
def选择器(我的1D数组):
newArray=np.zero((len(my_1D_数组),5))
对于枚举中的x(my_1D_数组):
如果x[1]5:
y=np.数组([3,3,3,3])
新数组[x[0]]=y
返回新数组
这是可行的…但对我来说似乎很迂回,效率对我的应用程序很重要。所以我有了一个比较的想法:

def np_选择器(我的1D_数组):

condlist=[my_1D_array也许可以用
np编写得更好。选择
,但您始终可以:

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

也许可以使用
np编写得更好。选择
,但您始终可以这样做:

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
这个,

这个,


np\u chooser
我的1D\u数组提供了正确的结果。重塑(-1,1)
。感谢你们的帮助,伙计们……尽管我仍然很好奇是否有其他人能想出更好的方法。

np\u chooser
我的1D\u数组提供了正确的结果。重塑(-1,1)
。谢谢你们的帮助,伙计们……尽管我还是很好奇是否还有其他人能想出更好的方法。

对不起。我真的应该更擅长编写示例。
y
数组可以是任何东西。在我的情况下,它们应该是
1
0
。对不起,我真的应该更擅长编写示例。
y
>数组可以是任何东西。在我的例子中,它们应该是
1
0
。谢谢,但是你能想出一个更一般的np.where的例子吗?我只是重复使用int,因为我很懒;但实际上,
y
是int的随机组合(在我的例子中是1和0)谢谢,但是你能想出一个更一般的np.where的例子吗?我之所以使用重复整数是因为我很懒;但实际上,
y
是整数的随机组合(在我的例子中是1和0).谢谢,但是你能想出一个更一般的情况吗?我只是因为我懒惰而使用重复整数;但实际上,y是整数的随机组合(在我的例子中是1和0)。谢谢,但是你能想出一个更一般的情况吗?我只是因为我懒惰而使用重复整数;但实际上,y是整数的随机组合(我的情况是一加零)。
>>> 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.]])
>>> 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.]])
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.]]