将 2D numpy 数组重塑为 3 个具有 x,y 索引的 1D 数组

Posted

技术标签:

【中文标题】将 2D numpy 数组重塑为 3 个具有 x,y 索引的 1D 数组【英文标题】:Reshape 2D numpy array into 3 1D arrays with x,y indices 【发布时间】:2022-01-21 14:38:35 【问题描述】:

我有一个充满值的 numpy 二维数组 (50x50)。我想将二维数组展平为一列(2500x1),但这些值的位置非常重要。索引可以转换为空间坐标,所以我想要另外两个 (x,y) (2500x1) 数组,这样我就可以检索相应值的 x,y 空间坐标。

例如:

My 2D array: 
--------x-------
[[0.5 0.1 0. 0.] |
 [0. 0. 0.2 0.8] y
 [0. 0. 0. 0. ]] |

My desired output: 
#Values
[[0.5]
 [0.1]
 [0. ]
 [0. ]
 [0. ]
 [0. ]
 [0. ]
 [0.2]
 ...], 
#Corresponding x index, where I will retrieve the x spatial coordinate from
[[0]
 [1]
 [2]
 [3]
 [4]
 [0]
 [1]
 [2]
 ...], 
#Corresponding y index, where I will retrieve the x spatial coordinate from
[[0]
 [0]
 [0]
 [0]
 [1]
 [1]
 [1]
 [1]
 ...], 

关于如何做到这一点的任何线索?我已经尝试了一些方法,但没有奏效。

【问题讨论】:

【参考方案1】:

为了简单起见,让我们用这段代码重现你的数组:

value = np.arange(6).reshape(2, 3)

首先,我们创建变量 x, y,其中包含每个维度的索引:

x = np.arange(value.shape[0])
y = np.arange(value.shape[1])

np.meshgrid 是方法,与您描述的问题有关:

xx, yy = np.meshgrid(x, y, sparse=False)

最后,用这些线将所有元素转换成你想要的形状:

xx = xx.reshape(-1, 1)
yy = yy.reshape(-1, 1)
value = value.reshape(-1, 1)

【讨论】:

【参考方案2】:

根据你的例子,np.indices:

data = np.arange(2500).reshape(50, 50)
y_indices, x_indices = np.indices(data.shape)

重塑您的数据:

data = data.reshape(-1,1)
x_indices = x_indices.reshape(-1,1)
y_indices = y_indices.reshape(-1,1)

【讨论】:

【参考方案3】:

假设您想要展平并重塑为单列,请使用reshape

a = np.array([[0.5, 0.1, 0., 0.],
              [0., 0., 0.2, 0.8],
              [0., 0., 0., 0. ]])

a.reshape((-1, 1)) # 1 column, as many row as necessary (-1)

输出:

array([[0.5],
       [0.1],
       [0. ],
       [0. ],
       [0. ],
       [0. ],
       [0.2],
       [0.8],
       [0. ],
       [0. ],
       [0. ],
       [0. ]])
获取坐标
y,x = a.shape
np.tile(np.arange(x), y)
# array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3])
np.repeat(np.arange(y), x)
# array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2])

或者干脆使用unravel_index:

Y, X = np.unravel_index(range(a.size), a.shape)
# (array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2]),
#  array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]))

【讨论】:

谢谢你,你知道我如何对空间坐标做同样的事情吗? @user3611 当然,请参阅编辑 索引部分使用np.unravel_index(range(a.size), a.shape)比较简单 @bb1 谢谢,很好!我会更新答案! 谢谢大家的帮助!这些有效!

以上是关于将 2D numpy 数组重塑为 3 个具有 x,y 索引的 1D 数组的主要内容,如果未能解决你的问题,请参考以下文章

在 NumPy 中将 4D 数组重塑为 2D 数组背后的直觉和想法

如何将 numpy 数组重塑为 3 维以输入到卷积层?

Numpy 用 1 列将 1d 重塑为 2d 数组

如何将 4D numpy 数组重塑为 3D 数组

重塑 3 列 numpy 数组

Numpy“Fortran”式重塑?