【问题标题】:Extract elements of an N-dimensional array within a list in Python在 Python 中的列表中提取 N 维数组的元素
【发布时间】: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


【解决方案1】:

我建议使用numpy.array 数组而不是嵌套列表。

import numpy as np

# Create some data which would be equal to your "params"
a = np.array([[[1, 2, 3],
               [4, 5, 6],
               [7, 8, 9]],
              [[11, 12, 13],
               [14, 15, 16],
               [17, 18, 19]]])

print(a[0])
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]

print(a[:, 0, 0])
# [1, 11]

print(a[:, 0:2, 0])
# [[1, 4] 
#  [11, 14]]

此外,numpy 可以与给定 here 的 Cython 结合使用。

【讨论】:

    【解决方案2】:

    为什么 Python 不能在这里区分矩阵的元素和列表的元素?什么是最好的解决方案?

    因为history.params[0] 是一个列表的列表,所以history.params[0][0] 是一个列表,所以history.params[0][0][:]list[:],它是内部列表的副本。同样,history.params[0][:] 是列表列表的副本,所以history.params[0][:][0](copy of the list of lists)[0],这又是内部列表的第一行,但在二维数组的副本中。

    如果您想展平您的列表,即将一个二维数组存储为一个列表,则大小为NxM 的二维数组(n,m) 处的每个元素将成为展平数组中的元素(n*M + m)。因此,在您发布的 4x3 中,元素 (0,0) 是平面列表的元素 0,元素 (2,1) 是元素 2*3+1 = 7,依此类推。

    您可以将其扩展到 3D 数组:大小为 KxNxM 的数组,您的索引 (k,n,m) 是元素 (k*N*M + n*N + m);对于更高的维度也是如此。

    【讨论】:

      猜你喜欢
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      • 2011-03-19
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      相关资源
      最近更新 更多