【问题标题】:Convert a numpy boolean array to int one with distinct values将 numpy 布尔数组转换为具有不同值的 int 数组
【发布时间】:2013-12-19 02:36:42
【问题描述】:

我已经阅读了大部分 How to convert a boolean array to an int array ,但我仍然不知道如何(最有效地)将 numpy bool 数组转换为 int 数组,但具有不同的值。例如,我有:

>>> k=np.array([True, False, False, True, False])
>>> print k
[ True False False  True False]

我希望将其转换为数组,其中 True 表示 2,False 表示 5。

当然,我总是可以建立一个线性方程:

>>> print 5-k*3
[2 5 5 2 5]

...虽然是矢量化的,但不必要地同时使用了加法(减法)和乘法;此外,如果我想要相反的值(True 为 5,False 为 2),我基本上必须使用(并重新计算)不同的方程:

>>> print 2+k*3
[5 2 2 5 2]

... 这对我来说有点可读性问题。

本质上,这只是一个选择/映射操作——但我想在numpy 域中完成。我怎么能这样做?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    似乎numpy.where 正是你想要的:

    >>> import numpy as np
    >>> k = np.array([True, False, False, True, False])
    >>> np.where(k, 2, 5)
    array([2, 5, 5, 2, 5])
    

    【讨论】:

    • 太棒了 - 非常感谢,@mgilson!实际上,正在寻找可以在递归 np.add 中工作的东西(但没有提到,因为我想将问题简化为“基本要素”),这看起来可以解决问题!再次感谢 - 干杯!
    • PS: re: "recursive add",现在我已经提到了(即使这个问题有点离题):任何人都有其他任何东西 除了参数中的“原始”引用,甚至只是添加,例如在a=np.array([1,3,3,4,5,6]); np.add(a[:-1]+0, 2, a[1:]); print a 中——numpy 将使用a[:-1] 的“旧”值(在a[:-1]+0 中)并且将“递归”到“新”以前的位置;因此,np.where(可能还有任何其他函数)将产生相同的效果。
    【解决方案2】:

    好吧,看来我必须创建一个包含两个不同值的 np.array(不是 Python 列表!):

    >>> z=np.array([2,5])
    >>> print z
    [2 5]
    

    ...然后我可以简单地将布尔数组 (k) 转换为 int,并将其用作“不同值数组”(z) 中的选择索引:

    >>> print z[k.astype(int)]
    [5 2 2 5 2]
    

    将 [2,5] 更改为 [5,2] 也很简单,这样很好。

    我只是不确定这是否是正确的做法(也就是说,可能存在类似(伪代码)k.asdistinctvalues([2,5]) 或类似的东西?)

    【讨论】:

    • 去买我看到的袜子木偶帽?好动。我也需要想出一些问题来问一个问题...... ;-)
    • 呵呵 - 老实说,有时当我因无法使用搜索词找到方法而感到沮丧时,我会以 Q&A 格式记录 SO 上的内容,以便下次输入时可以找到它在搜索引擎中;希望这不是犯罪。干杯! :)
    • 显然这不是犯罪,他们甚至会鼓励这样做——他们选择用帽子奖励这种行为!
    猜你喜欢
    • 2014-12-20
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多