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.]]