从空间数据阵列(2D)和时间数据阵列(2D)构建时空numpy阵列(3D)

apeeds0o  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(114)

我有第一个2D数组,它表示空间点的位置。让我们把它命名为A。我的第一个数组的形状为(N,2),其中N表示空间点的数量,2对应于变量x和y。然后,我有第二个2D数组,对应于形状为(T,3)的时间序列B,其中T是时间步长的数量,3对应于时间t和另外两个变量,我将命名为y1,y2。我想要的是构建一个形状为(N,T,2 + 3)的3D数组C,它将每个空间点与第二个数组B相关联,使得C具有以下列:(x,y,t,yi,y2)或(t,yi,y2,x,y)。我可以通过循环来做,但是对于大数据,它变得不有效。你有更有效的方法吗?下面是一个例子:

A = np.array([
    [1, 2],
    [3, 4]
])

B = np.array([
    [-1, -1],
    [-2, -2],
    [-3, -3]
])

C = np.zeros((2, 3, 4))
for j in range(2):
    C[j, :, :2] = np.tile(A[j:j + 1, :], (3, 1))
    C[j, :, 2:] = B

print(A)
print(B)
print(C)

输出:

A
 [[1 2]
 [3 4]]

B
 [[-1 -1]
 [-2 -2]
 [-3 -3]]

C
 [[[ 1.  2. -1. -1.]
   [ 1.  2. -2. -2.]
   [ 1.  2. -3. -3.]]

  [[ 3.  4. -1. -1.]
   [ 3.  4. -2. -2.]
   [ 3.  4. -3. -3.]]]
xnifntxz

xnifntxz1#

NumPy广播!
首先,你需要重塑A和B,使它们可以一起广播。您可以通过向A和B添加新轴来实现这一点:

A = np.array([
    [1, 2],
    [3, 4]
])

B = np.array([
    [-1, -1],
    [-2, -2],
    [-3, -3]
])

A_reshaped = A[:, np.newaxis, :]  # shape (N, 1, 2)
B_reshaped = B[np.newaxis, :, :]  # shape (1, T, 3)

现在,您可以使用NumPy广播来合并重新整形的A和B数组,然后沿着最后一个轴连接广播的数组。

A_broadcasted, B_broadcasted = np.broadcast_arrays(A_reshaped, B_reshaped)
C = np.concatenate((A_broadcasted, B_broadcasted), axis=2) # shape (N, T, 2 + 3)

输出将是预期结果:

[[[ 1  2 -1 -1]
  [ 1  2 -2 -2]
  [ 1  2 -3 -3]]

 [[ 3  4 -1 -1]
  [ 3  4 -2 -2]
  [ 3  4 -3 -3]]]

相关问题