如何将这个多维列表重塑为二维数组?
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)]
我知道这个问题已经被问过很多次了,我试图获得使用多维数组的直觉 (
我使用 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)]