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

时间:2019-04-14 03:38:15

标签: python arrays numpy multidimensional-array reshape

我知道这个问题已经问了几十遍了,我已经尝试了使用多维数组的直觉(herehere),但我不知道过程。

使用Calendar库中的yeardatescalendar(),我得到了几天,几周,几个月的时间,这些数据打包成4D列表。

import calendar

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

返回值是月份行的列表。每个月行最多包含3个月。每个月包含4至6周,每个星期包含1至7天。

enter image description here

我正在尝试将其转换为2D数组,所以这只是几周的清单。但是,即使我尝试执行此操作,我也无法理解输出。

# 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 个答案:

答案 0 :(得分:1)

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

  • 多月大块

因此,例如,yr_11[2][1][3][2]将给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)]