首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Numpy:给定标量矩阵的一维数组的np.select

Numpy:给定标量矩阵的一维数组的np.select
EN

Stack Overflow用户
提问于 2013-03-14 23:22:16
回答 3查看 663关注 0票数 1

我想得到这样的东西:

代码语言:javascript
复制
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做比较

代码语言:javascript
复制
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上的选择列表值。有更好的方法来完成上述问题的通用版本吗?

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-15 01:20:04

np_choozer给出了my_1D_array.reshape(-1,1)的正确结果。谢谢你的帮助,guys...though,我仍然很好奇是否还有其他人能想出一个更好的方法。

票数 0
EN

Stack Overflow用户

发布于 2013-03-14 23:33:16

也许可以用np.select编写得更好,但您可以始终这样做:

代码语言:javascript
复制
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

举个例子:

代码语言:javascript
复制
>>> 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.]])

编辑上面的代码利用了赋值中的广播,但是123可以被一个5元素列表或数组取代。使用与上面的示例相同的ab

代码语言:javascript
复制
>>> 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
EN

Stack Overflow用户

发布于 2013-03-15 00:00:06

这,

代码语言:javascript
复制
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)

给我这个,

代码语言:javascript
复制
[[ 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.]]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15422038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档