1

我有一个 3d 矩阵grid_z0,其尺寸是(比方说)50x25x36。该矩阵的每个点代表一个单元格。我想将此矩阵转换为大小为 50x25x36 的一维数组。我还想创建 3 个相同大小的数组来显示单元格中心的坐标。数组cx,cycz存储单元格中心在一个方向上的坐标。

此示例有效,但速度较慢,尤其是对于大型数据集。有没有办法让它更快?

data={"x":[],"y":[],"z":[],"rho":[]}

for i in arange(0,50):
  for j in arange(0,25):
    for k in arange(0,36):
      data["x"].append(cx[i])
      data["y"].append(cy[j])
      data["z"].append(cz[k])
      data["f"].append(grid_z0[i][j][k])
4

2 回答 2

3

您应该考虑使用NumPy

>>> import numpy as np
>>> a = np.random.rand(50,25,36) # Create a fake array
>>> print a.shape
(50, 25, 36)
>>> a.shape = -1 # Flatten the array in place
>>> print a.shape
(45000,)

展平阵列时,您正在执行以下操作:

>>> b = []
>>> for i in range(a.shape[0]):
...     for j in range(a.shape[1]):
...         for k in range(a.shape[2]):
...             b.append(a[i,j,k])

也就是说,最后一个轴首先被解析,然后是第二个,然后是第一个。

给定您的三个 1D 列表cx, cy,cz长度N,您可以构造一个 2D 数组:

>>> centers = np.array([cx,cy,cz])
>>> print centers.shape
(3, N)
于 2012-09-17T09:25:54.440 回答
2

使用Numpy进行矩阵/数组操作。

# convert to 1D array :
grid_1d = np.asarray(grid_z0).ravel()

对于第二个问题,您需要一个 3D 网格网格。见这里的例子: Numpy meshgrid in 3D

于 2012-09-17T09:28:13.780 回答