【问题标题】:python "IndexError: index 8 is out of bounds for axis 0 with size 8"python“IndexError:索引 8 超出轴 0 的范围,大小为 8”
【发布时间】:2019-07-30 08:22:32
【问题描述】:

这个问题需要我编写一个函数,它从给定函数的输出中编译一个素数列表,该函数给出 2 个列表,一个从 2 到任意数字的数字列表和第二个与第一个具有“真”或“假”值的列表取决于第一个列表中的数字是否为素数。

我不知道我的代码在回答问题时是否根本错误,或者我是否在正确的轨道上并且只是犯了一个错误......

任何帮助将不胜感激。

问题:

编写一个接受单个输入 N 的函数(称为 primes_list)。该函数必须使用 prime_sieve 函数来计算并返回一个仅包含小于或等于 N+1 的素数的数组(或列表)。

例如,如果 N=8,此函数应返回 [2,3,5,7]

给定的代码:

import numpy as np

def prime_sieve(N):
    nums = np.arange(2, N+2, 1)
    mask = []
    for n in nums:
        mask.append(True)
    for n in nums:     
        for i in np.arange(2*n-2, N, n):
            mask[i] = False
    return nums, np.array(mask)

numbers, mask = prime_sieve(8)
print(numbers)
print(mask)

[2 3 4 5 6 7 8 9]
[ True  True False  True False  True False False]

我的代码:

import numpy as np

def primes_list(N):
    numbers, mask = prime_sieve(N)
    primes = []
    for n in numbers:
        if mask[n] == "true":
            primes.append(numbers[n])
    return primes

print(primes_list(8))

但这会报错:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
 <ipython-input-60-4ea4d2f36734> in <module>
----> 2 print(primes_list(8))

<ipython-input-59-a5080837c5c8> in primes_list(N)
      6     primes = []
      7     for n in numbers:
----> 8         if mask[n] == "true":
      9             primes.append(numbers[n])
     10     return primes

IndexError: index 8 is out of bounds for axis 0 with size 8

【问题讨论】:

    标签: python numpy index-error


    【解决方案1】:

    你的n,你用来分割你的列表mask是一个不适合索引的数字列表(因为它总是包含N,N+1,而mask的最后一个索引是N -1)。

    另外,第二个列表 mask 包含 Bool 而不是 str,因此您对 mask[n] == 'true' 的比较将总是返回 False

    考虑到以上几点,您的primes_list 可以是:

    def primes_list(N):
        numbers, mask = prime_sieve(N)
        primes = []
        for i, n in enumerate(numbers): # <<< added enumerate 
            if mask[i]:                 # <<< removed unnecessary comparison
                primes.append(n)        # <<< append n directly
        return primes
    

    返回:

    [2, 3, 5, 7]
    

    应该如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 2017-02-16
      • 2019-08-26
      • 2021-11-18
      • 1970-01-01
      相关资源
      最近更新 更多