【问题标题】:Use while loop to increment values in an array, untill all values are => 100使用 while 循环递增数组中的值,直到所有值 => 100
【发布时间】:2019-05-30 02:30:37
【问题描述】:

所以这是本书how to think like a cs, python3中的练习之一,第138页: 使用掩码将以下列表中低于 100 的所有值乘以 2:

a = np.array([230, 10, 284, 39, 76])

重复此操作,直到所有值都高于 100。(不是手动,而是通过循环) 然后,选择 150

所以我尝试这样做:

while a.all() <= 100:
    a[a < 100] *= 2

print(a[150 < a < 200])

它不会退出循环,即使它在达到 [230 160 284 156 152] 后停止乘法。

对不起,如果这是一个以前曾被问过的问题,但我无法在任何地方找到答案......

【问题讨论】:

  • 是的,我忘了提。 a.any() &lt; 100 也产生相同的结果...

标签: python arrays python-3.x numpy while-loop


【解决方案1】:

a.all() &lt;= 100 不会做你想做的事。您可能想将其更改为以下内容:

(a <= 100).all() 

此外,首先,在while 循环中使用该条件并不是一个好主意。其次,您的数组包含比100 更多和更少的项目,这使您的条件和while 循环无用。如果您想使用简单的循环而不是以矢量化方式执行此操作,那么使用 numpy 也是没有意义的。您可以简单地使用 python 列表。

【讨论】:

  • 您的解决方案是正确的,我只是不明白您解释段落中的几乎所有内容。 1. 为什么这个条件不是一个好主意? 2.a在循环内被修改,所以不是没用。 3. a 的改变方式适用于 numpy 索引,并使用应用于整个数组(即矢量化)的数学函数,这需要 numpy 并且不适用于列表。
  • @SpghttCd 首先,交替您的条件所依赖的对象可能会在您的程序中导致大量泄漏,特别是如果您在其他地方使用该对象。其次,链条的强度与其最薄弱的一环一样强。这意味着,当您将 numpy 和 python 结合起来时,它就是定义最终性能的 python,那么为什么要使用第三方库来打扰并制造很多混乱,而您可以使用 Python 的内置函数/对象/库简单地完成相同的工作/等等。
  • @Kasrâmvd,你是绝对正确的,但是我只是尝试按照练习说明进行操作,其中说明你必须使用数组
【解决方案2】:
while np.count_nonzero(a<=100) > 0: 
    a[a<100] *= 2

print(a[(150<a) & (a < 200)])

您的程序中有两个错误。一、根据numpydocumentationnp.all()

测试沿给定轴的所有数组元素是否评估为 True。 所以这里似乎没什么用。

其次,没有a &lt; x &lt; b 方法来检查 x 是否在区间 [a,b] 上。 NumPy 的方法是 (a&lt;x) &amp; (x&gt;b)

【讨论】:

  • 非常感谢!!!现在可以了...我从来没有到达最后一个语句,所以我什至没有注意到它是如何行不通的。
猜你喜欢
  • 1970-01-01
  • 2017-12-12
  • 2012-04-15
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
相关资源
最近更新 更多