Как я могу изменить этот многомерный список в 2D массив? - PullRequest
1 голос
/ 14 апреля 2019

Я знаю, что об этом спрашивали десятки раз, и я пытался понять ( здесь , здесь ) работы с многомерными массивами, но я могу 't понять процесс.

Я получаю дни, недели, месяцы года, используя yeardatescalendar() из библиотеки Calendar , упакованной в четырехмерный список.

import calendar

cal = calendar.Calendar()
yr_11 = cal.yeardatescalendar(2011)

Возвращаемое значение - список строк месяца.Каждая строка месяца содержит до 3 месяцев.Каждый месяц содержит от 4 до 6 недель, а каждая неделя содержит 1–7 дней.

enter image description here

Я пытаюсь преобразовать это в двумерный массив, чтобы онэто просто список недель.Но даже когда я пытаюсь сделать это, я не понимаю результат.

# create an array
arr = np.array(yr_11)

arr.ndim # this returns '2'

arr.shape # this returns (4,3)

# yr_11 holds 63 weeks, so I tried to reshape
new_array = arr.reshape(63,1)

Но выдает ошибку: ValueError: cannot reshape array of size 12 into shape (63,1)

Может кто-нибудь объяснить, что происходит, и помочь превратить это в 2D-массив?

Редактировать: по сути, яищу это

[[datetime.date(2010, 12, 27),
 datetime.date(2010, 12, 28),
 datetime.date(2010, 12, 29),
 datetime.date(2010, 12, 30),
 datetime.date(2010, 12, 31),
 datetime.date(2011, 1, 1),
 datetime.date(2011, 1, 2)],
[datetime.date(2011, 1, 3),
 datetime.date(2011, 1, 4),
 datetime.date(2011, 1, 5),
 datetime.date(2011, 1, 6),
 datetime.date(2011, 1, 7),
 datetime.date(2011, 1, 8),
 datetime.date(2011, 1, 9)], ... ]

1 Ответ

1 голос
/ 14 апреля 2019

Вложенное list, возвращаемое yeardatescalendar, имеет следующую иерархию:

  • Куски многомесячных
  • месяцев
  • 1010 * Неделя *
  • Количество дней

Поэтому, например, yr_11[2][1][3][2] даст datetime, представляющий 3-й день на 4-й неделе 2-го месяца в 3-м блоке. Помните, что индексирование идет слева (наименее вложенный) вправо (наиболее вложенный), но мы обычно читаем такие элементы в противоположном направлении (сначала наиболее гранулированный)

Чтобы упростить наши вычисления, мы можем передать width=12, чтобы наш результат состоял из одного блока, содержащего 12 месяцев.

Далее осталось просто сгладить list и передать результат в np.array:

import calendar

cal = calendar.Calendar()
yr_11 = cal.yeardatescalendar(2011, width=12)

flat = [day for month in yr_11[0] for week in month for day in week]
dates = np.array(flat)

print(dates)

Выход:

[datetime.date(2010, 12, 27) datetime.date(2010, 12, 28)
 datetime.date(2010, 12, 29) datetime.date(2010, 12, 30)
 datetime.date(2010, 12, 31) datetime.date(2011, 1, 1)
 ...
 datetime.date(2011, 12, 28) datetime.date(2011, 12, 29)
 datetime.date(2011, 12, 30) datetime.date(2011, 12, 31)
 datetime.date(2012, 1, 1)]
...