我正试图得到这样的东西:
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上的选择列表值。是否有更好的方法来处理上述问题的一般版本?
提前致谢。
答案 0 :(得分: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.]])
答案 1 :(得分: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.]]
答案 2 :(得分:0)
np_choozer
为my_1D_array.reshape(-1,1)
提供了正确的结果。谢谢你的帮助,伙计们......虽然我仍然很想知道是否还有其他人能想出更好的办法。