【发布时间】:2014-04-16 08:39:49
【问题描述】:
我有以下问题。我在一个类中保存了大量数据。这些数据大部分是时间相关的,在最复杂的情况下,变量是 3 维数组。
因为列表非常灵活(不需要显式声明),我想用它们来封装我的 N 维数组,因此,使用列表来保存时间相关信息。
这是我的列表中元素 t=0、t=2 和 t=3 的典型示例,它在历史类中(一个简单的 float64 矩阵):
history.params[0]
array([[ 1. , 2. , 1. ],
[ 1. , 2. , 1. ],
[ 0.04877093, 0.53176887, 0.26210472],
[ 2.76110434, 1.3569246 , 3.118208 ]])
history.params[2]
array([[ 1.00000825, 1.99998362, 1.00012835],
[ 0.62113657, 0.47057772, 5.23074169],
[ 0.04877193, 0.53076887, 0.26210472],
[ 0.02762192, 4.99387138, 2.6654337 ]])
history.params[3]
array([[ 1.00005473, 1.99923187, 1.00008009],
[ 0.62713657, 0.47157772, 5.23074169],
[ 0.04677193, 0.53476887, 0.25210472],
[ 0.02462192, 4.89387138, 2.6654337 ]])
现在,对于所有时间索引 t,如何读取/提取矩阵给定坐标 (x,y) 处的所有元素?
我尝试过这样做:
history.params[:][0][0]
我明白了
array([ 1., 2., 1.])
实际上,无论冒号在哪里,我总是得到相同的值,它们对应于我的矩阵的第一行:
"history.params[0][:][0]" returns "array([ 1., 2., 1.])" in the shell
"history.params[0][0][:]" returns "array([ 1., 2., 1.])"
为什么 Python 不能在这里区分矩阵的元素和列表的元素?什么是最好的解决方案?
当然,我可以编写一些循环并创建一个新变量来重新组织我的数据,但这有点浪费精力。我确信它存在一个优雅的解决方案。
PS:我将在某个时候“Cythonize”我的代码,所以如果你有一个优化的 Cython 解决方案来存储这些变量,我也很高兴听到它。
【问题讨论】:
-
感谢您的建议。我保留了时间依赖性的列表,因为它更容易实现:我不需要指定时间变量的初始大小。受您评论的启发,我选择了一个显式声明的 N 维数组(使用 np.zeros()),大小为 T 足够大。索引不是问题,但变量可能会占用比所需空间更多的空间......现在内存很便宜。
标签: python arrays list matrix cython