Использование структуры "for" l oop, генерация чисел и фильтрация их по структурам "length" и "% (mod)" - PullRequest
0 голосов
/ 07 апреля 2020

(Источник кодирования)

import numpy as np

arr = np.array([2,4,9,10])

psuedo = [arr + 11 * x for x in range(1, 10)] # generate numbers using "arr" values

for i in range(len(arr)): # call each values in "arr"

    if psuedo % arr[i] == 0: # each values in "arr" applies and divides to generated numbers 
        break # if generated numbers are divided by each "arr" values then break
    else:
        print(psuedo) # else, then print.

Результаты:

[array([13, 15, 20, 21]), array([24, 26, 31, 32]), array([35, 37, 42, 43]), array([46, 48, 53, 54])]

Ожидаемые результаты:

[array([13, 15, 21])], array([31]), array([35, 37, 43]), array([53])

Я ожидал, что сгенерированное каждое число (результаты) будет разделить на каждое из 2, 4, 9 и 10 и распечатать до тех пор, пока оно будет удовлетворено pseudo % arr[i] !=0.

В чем проблема выше кодирования?

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Проблема с вашим кодом заключается в том, что операция pseudo % arr[i] возвращает новый массив массивов, каждый из которых заменяется результатами модификации каждого элемента этого массива с помощью arr [i]. Поэтому сравнивать этот массив массивов с 0 не имеет смысла. Что вы, вероятно, хотите сделать, это перебрать все массивы псевдо, а затем отфильтровать элементы из тех отдельных массивов, которые не удовлетворяют вашему условию, например:

import numpy as np

arr = np.array([2,4,9,10])

pseudo = [arr + 11 * x for x in range(1, 10)]

def is_not_mod(x):
    keep = True
    for mod in arr:
        if x % mod == 0:
            keep = False
            break
    return keep

for idx, array in enumerate(pseudo):
    pseudo[idx] = np.array(list(filter(is_not_mod, array)))

print(pseudo)
0 голосов
/ 07 апреля 2020

Честно говоря, я почти не знаю, что вы пытаетесь рассчитать. Но есть некоторые вещи, которые могут принципиально не работать так, как вы намереваетесь.

  • Прежде всего pseudo % arr[i] == 0 неправильно на нескольких уровнях, я понятия не имею, какую версию Python вы используете, что это не создает ошибок.
  • break останавливает for -l oop. Я предполагаю, что вы хотите использовать continue (go для следующей итерации) или pass (не делать ничего) вместо этого (и, таким образом, вы можете просто указать код, пропустив его полностью)

Это мое предположение:

import numpy as np
arr = np.array([2, 4, 9, 10])
pseudo = [arr + 11 * x for x in range(1, 10)]
print([[i for i in x if (i%arr).all()] for x in pseudo])

Это создает

[[13, 15, 21], [31], [35, 37, 43], [53], [57, 59, 65], [75], [79, 87], [97], [101, 103, 109]]

Позвольте мне объяснить:

  • Цикл над массивами x внутри pseudo и значения i in x, поэтому первое x будет np.array([13, 15, 20, 21]), а первое i inthere будет 13.
  • (i%arr) - это массив np.array([i%2, i%4, i%9, i%10])
  • .all() возвращает True, если все значения отличны от нуля, т. Е. Если ваш i не делится ни на один из элементов в arr.
  • [i for i in x if (i%arr).all()] является списком поэтому мы создаем новый список со всеми элементами в x, которые не делятся ни на один из элементов в arr.
  • Мой вывод содержит списки, но вы можете просто создать np.array s, если это лучше
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...