Я новичок в python, и я застрял, вероятно, очень глупо. Итак, мне нужно создать массив кортежей (я знаю, что списки будут лучше, но только моя задача... может быть, бросок в конце?) С равномерно распределенными числами. Торы должны иметь длину от 1 до 3. Я придумал это очень тривиальное решение:
array = [(int(x),int(y),int(z)) for x in np.linspace(start = 1, stop = 61, num = 6) for y in np.linspace(start = 1, stop = 61, num = 6) for z in np.linspace(start = 1, stop = 61, num = 6)]
array.append((int(x),int(y)) for x in np.linspace(start = 1, stop = 61, num = 11) for y in np.linspace(start = 1, stop = 61, num = 11))
array.append((int(x),) for x in np.linspace(start = 1, stop = 61, num = 18))
Но когда я печатаю массив, он содержит только кортежи с 3 элементами, так как функции append не работают (хотя ошибки не указаны).
Я не мог найти ничего, что могло бы помочь мне в Интернете, и поэтому я здесь, чтобы задать два вопроса:
Большое вам спасибо за помощь.
Несколько вещей здесь. Во-первых, вы на самом деле работаете со list
а не с массивами numpy. Во-вторых, массивы numpy неэффективны, если вы не исправляете их размер. Лучше всего избегать расходования или добавления массива numpy. Теперь о вашем коде:
В первой строке создается список кортежей размера 3 с требуемыми значениями.
array = [(int(x),int(y),int(z)) for x in np.linspace(start = 1, stop = 61, num = 6) for y in np.linspace(start = 1, stop = 61, num = 6) for z in np.linspace(start = 1, stop = 61, num = 6)]
# len() = 216
Тогда то, что вы передаете методу append()
самом деле является генератором
((int(x),int(y)) for x in np.linspace(start = 1, stop = 61, num = 11) for y in np.linspace(start = 1, stop = 61, num = 11))
# <generator object <genexpr> at 0x00000184FE7DB360>
Поэтому он ничего не делает... То же самое для третьей линии. Я очень удивлен, что этот синтаксис не проходит через ошибку.
Теперь решение, это использовать extend()
. Этот метод примет список в качестве аргумента и расширит первый список.
array = [(int(x),int(y),int(z)) for x in np.linspace(start = 1, stop = 61, num = 6) for y in np.linspace(start = 1, stop = 61, num = 6) for z in np.linspace(start = 1, stop = 61, num = 6)]
array.extend([(int(x),int(y)) for x in np.linspace(start = 1, stop = 61, num = 11) for y in np.linspace(start = 1, stop = 61, num = 11)])
array.extend([(int(x),) for x in np.linspace(start = 1, stop = 61, num = 18)])
# len() = 355 you got all the items.
Вы должны использовать расширение вместо append:
array.extend((int(x),int(y)) for x in np.linspace(start = 1, stop = 61, num = 11) for y in np.linspace(start = 1, stop = 61, num = 11))
array.extend((int(x),) for x in np.linspace(start = 1, stop = 61, num = 18))
В настоящее время вы добавляете объекты генератора вместо кортежей.