Массивы кортежей

1

Я новичок в 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 не работают (хотя ошибки не указаны).

Я не мог найти ничего, что могло бы помочь мне в Интернете, и поэтому я здесь, чтобы задать два вопроса:

  • Есть ли более разумный способ достичь результата, который я хочу? (Просто, чтобы узнать текущий Python "современное состояние", возможно, в одной строке)
  • Почему этот код не делает то, что я думаю, что он должен делать? (Поэтому я могу лучше понять то, что я использую).

Большое вам спасибо за помощь.

Теги:
arrays
numpy

2 ответа

0
Лучший ответ

Несколько вещей здесь. Во-первых, вы на самом деле работаете со 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.
  • 0
    Спасибо! Знаете ли вы, есть ли способ получить тот же результат только в объявлении, без вызова других функций?
  • 0
    @Tanatopseustes Я предполагаю, что вы подразумеваете под своим вопросом то же самое в одной строке. Поскольку количество точек меняется в зависимости от размера кортежа, я не вижу способа сделать все это сразу.
Показать ещё 1 комментарий
0

Вы должны использовать расширение вместо 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))

В настоящее время вы добавляете объекты генератора вместо кортежей.

  • 0
    Большое спасибо :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню