使用列中的索引位置重塑NumPy数组

2024-06-17 12:38:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个3列numpy数组,如下所示

[0 0 'a'
 0 1 'b'
 1 0 'c'
 1 1 'd']

第一列包含第三列值的行索引,第二列包含列索引。也就是说,最终输出应该是

['a' 'b'
 'c' 'd']

如何使用numpy将第三列的值放置在前两列中指定的索引处的numpy数组中?实际上,我的数据集要大得多(这是用于高清图像,一张13000 x 11000像素的照片,所以效率很重要(避免循环))

谢谢


1条回答
网友
1楼 · 发布于 2024-06-17 12:38:30

可以使用numpy advanced indexing将值放置在空的实例化数组中。下面是一个示例,假设第三列实际上是数值的,值为[1, 3, 5, 7],并且矩阵是正方形(如果不是正方形,则可以更改空矩阵的形状,只要可以获得尺寸)

ar = np.array([[0, 0, 1, 1], [0, 1, 0, 1], [1, 3, 5, 7]]).T
n = int(np.sqrt(ar.shape[0]))  # Assuming you have a square matrix
out = np.empty([n, n])  # Create a new array of the expected shape
row_idx = ar[:, 0]
col_idx = ar[:, 1]
out[row_idx, col_idx] = ar[:, 2]  # Put the data into the indexed locations

返回:

>> out
array([[1., 3.],
       [5., 7.]])

如果第三列实际上是一个字符串,那么它就有点复杂了,因为在实例化numpy数组时必须指定要处理的字符串的大小,并且还要将索引片从object转换回int


编辑:字符串数据的附加信息。 如果您实际上试图将字符串放入numpy数组,则需要使用unicode字符串dtype='U1'kwarg到np.empty声明所需字符串的大小,其中U之后的数字是字符数组的长度

ar = np.array([[0, 0, 1, 1], [0, 1, 0, 1], ['a', 'b', 'c', 'd']]).T
row_idx = ar[:, 0].astype(int)
col_idx = ar[:, 1].astype(int)
out = np.empty([2, 2], dtype='U1')  # Unicode string
out[row_idx, col_idx] = ar[:, 2]

返回:

>> out
array([['a', 'b'],
       ['c', 'd']], dtype='<U1')

相关问题 更多 >