在python中遍历Truth数组,并用另一个数组中的组件替换真实值

时间:2019-07-02 00:25:06

标签: python arrays python-3.x numpy

比方说,我有一个Numpy数组真值数组,其外观类似于以下内容:

truths = [True, False, False, False, True, True]

还有另一个值数组,类似于:

nums = [1, 2, 3]

我想创建一个循环,用nums数组中的下一个数字替换trues数组中的所有真值,并将所有False值替换为0。

我想结束的时候看起来像这样:

array = [1, 0, 0, 0, 2, 3]

3 个答案:

答案 0 :(得分:3)

我会推荐numpy.putmask()。由于我们正在从类型bool转换为int64,因此我们需要先进行一些转换。

首先,初始化:

truths = np.array([ True, False, False, False,  True,  True])
nums = np.array([1, 2, 3])

然后我们根据掩码进行转换和替换(如果truth的元素为True)

truths = truths.astype('int64') # implicitly changes all the "False" values to 0
numpy.putmask(truths, truths, nums)

最终结果:

>>> truths
array([1, 0, 0, 0, 2, 3])

请注意,我们只是将truths传递到numpy.putmask()的“ mask”参数中。这将仅检查数组truths的每个元素是否正确;由于我们将数组转换为类型int64,因此它将根据需要仅替换非0的元素。

如果我们想变得更加古怪,或者需要替换一些任意值,我们将需要numpy.putmask(truths, truths==<value we want to replace>, nums)来代替。

据我所知,如果我们想更深入地研究而不是假设我们可以轻松地将类型转换(从boolint64的假设),我们可以d要么需要某种映射到其他numpy.array的映射,我们就可以在其中进行转换。我个人这样做的方法是将numpy.array转换为布尔型数组,我可以在其中进行这种简单的转换,但是可能会有更好的方法。

答案 1 :(得分:2)

您可以使用itertools中的cycle来遍历nums列表。然后,用您的布尔值压缩它,并使用三元列表理解。

from itertools import cycle  

>>> [num if boolean else 0 for boolean, num in zip(truths, cycle(nums))]
[1, 0, 0, 0, 2, 3]

答案 2 :(得分:1)

您可以在此处使用<?xml version="1.0" encoding="UTF-8"?> <configuration> <location path="privacy.html"> <system.webServer> <httpRedirect enabled="true" destination="/privacy/" httpResponseStatus="Permanent" /> </system.webServer> </location> <system.webServer> <rewrite> <rules> <rule name="privacy" stopProcessing="true"> <match url="^privacy" /> <action type="Rewrite" url="privacy.asp" /> </rule> </rules> </system.webServer> </configuration> ,因为您要循环播放。

itertools