将numpy布尔数组转换为具有不同值的整型数组

5

我已经阅读了大部分如何将布尔数组转换为整数数组,但是我仍然不知道如何(最有效地)将numpy布尔数组转换为具有不同值的整数数组。例如,我有:

>>> 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 领域中完成。 我该如何做到这一点?

2个回答

10

看起来 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的东西(但没有提到,因为我想将问题简化为“基本要素”),这看起来像是能解决问题的方法!再次感谢 - 干杯! - sdaau
PS: 关于“递归添加”,既然我已经提到了(即使这有点脱离本题的主题):每当我们在参数中除了“原始”参考之外添加_任何其他东西_,甚至仅仅是加法,例如 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(可能还有其他函数)将具有相同的效果。 - sdaau

1

好的,看起来我需要创建一个np.array(而不是Python列表!),其中包含两个不同的值:

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

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

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

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

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


1
看来你要去买袜子木偶帽了?好主意。我也需要想出一个问题来问一下...;-) - mgilson
呵呵 - 说实话,有时候我会因为用搜索词无法找到适合的方法而感到沮丧,于是我会以问答形式在SO上记录相关内容,这样下次我在搜索引擎中输入时可以找到;希望这不算犯罪。干杯!:) - sdaau
1
显然这不是一种罪行,他们甚至还在给予奖励——他们选择用帽子来奖励这种行为! - mgilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接