我想得到这样的东西:
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对我来说,这个works...but看起来很迂回,效率对我的应用程序很重要。所以我想把它和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)...but没有骰子。它返回轴1上的选择列表值。有更好的方法来完成上述问题的通用版本吗?
提前谢谢。
发布于 2013-03-15 01:20:04
np_choozer给出了my_1D_array.reshape(-1,1)的正确结果。谢谢你的帮助,guys...though,我仍然很好奇是否还有其他人能想出一个更好的方法。
发布于 2013-03-14 23:33:16
也许可以用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-15 00:00:06
这,
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.]]https://stackoverflow.com/questions/15422038
复制相似问题