如何将这个多维列表重塑为二维数组?

How can I reshape this multi-dimensional list to a 2D array?

我知道这个问题已经被问过很多次了,我试图获得使用多维数组的直觉 (, here),但我无法弄清楚这个过程。

我使用 Calendar 库中的 yeardatescalendar() 获取一年中的几天、几周、几个月,并打包到一个 4D 列表中。

import calendar

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

return 值是月份行的列表。每个月行最多包含 3 个月。每个月有 4 到 6 周,每周有 1-7 天。

我正在尝试将其转换为二维数组,因此它只是一个周列表。但即使我试图这样做,我也不理解输出。

# 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)

有人可以解释一下这是怎么回事并帮助将其转换为二维数组吗?

编辑:基本上我正在寻找这个

[[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)], ... ]

yeardatescalendar 返回的嵌套 list 具有以下层次结构:

  • 多月块
  • 个月

因此,例如,yr_11[2][1][3][2] 将在第 3 个块中给出代表第 2 个月第 4 周第 3 天的 datetime。请记住,索引是从左(嵌套最少的)到右(嵌套最多的)进行的,但我们通常以相反的方向读取此类元素(首先是最细粒度的)

为了简化我们的计算,我们可以传递 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)]