将数组索引插入转置数组

时间:2019-09-19 16:29:22

标签: python arrays numpy

假设我有数组:

[[2,1,5,2], 
 [1,4,2,1],
 [4,5,5,7],
 [1,5,9,3]]

我试图将数组转置为形状(16,3),其中结果数组中的前两个元素是索引号,最后一个是值。例如:

[[0, 0, 2], [1, 0, 1], [2, 0, 5], [3, 0, 2], [0, 1, 4], ....]

是否可以使用numpy函数或类似的函数?还是我必须使用自己的功能来做到这一点?

工作示例代码:

import numpy as np

src = np.array([[2,1,5,2],
                [1,4,2,1],
                [4,5,5,7],
                [1,5,9,3]])

dst = np.array([])


for x in range(src.shape[0]):
    for y in range(src.shape[1]):
        dst = np.append(dst, [[y, x, src[x][y]]])

print(dst.reshape(16,3))

2 个答案:

答案 0 :(得分:1)

我不知道numpy中是否有一个函数,但是您可以使用列表推导轻松地构建该数组:

import numpy as np

src = np.array([[2,1,5,2],
                [1,4,2,1],
                [4,5,5,7],
                [1,5,9,3]])

dst = np.array([ [y, x, src[x][y]] 
                 for x in range(src.shape[0]) 
                 for y in range(src.shape[1])])

print(dst.reshape(16,3))

希望这会有所帮助。

答案 1 :(得分:0)

更新:为此,有一个 numpy函数:

您可以使用numpy.ndenumerate

dst = np.array([[*reversed(x), y] for x, y in np.ndenumerate(src)])
print(dst)
#[[0 0 2]
# [1 0 1]
# [2 0 5]
# [3 0 2]
# [0 1 1]
# [1 1 4]
# [2 1 2]
# [3 1 1]
# [0 2 4]
# [1 2 5]
# [2 2 5]
# [3 2 7]
# [0 3 1]
# [1 3 5]
# [2 3 9]
# [3 3 3]]

ndenumerate将返回一个迭代器,它产生成对的数组坐标和值。首先,您需要反转所需输出的坐标。接下来的unpack the coordinates into a list 1 和该值,并使用列表推导来消耗迭代器。


原始答案

您可以尝试:

dst = np.column_stack(zip(*[*reversed(np.indices(src.shape)), src])).T
print(dst)
#[[0 0 2]
# [1 0 1]
# [2 0 5]
# [3 0 2]
# [0 1 1]
# [1 1 4]
# [2 1 2]
# [3 1 1]
# [0 2 4]
# [1 2 5]
# [2 2 5]
# [3 2 7]
# [0 3 1]
# [1 3 5]
# [2 3 9]
# [3 3 3]]

说明

首先,使用numpy.indices获得一个数组,该数组表示形状为src的网格索引。

print(np.indices(src.shape))
#[[[0 0 0 0]
#  [1 1 1 1]
#  [2 2 2 2]
#  [3 3 3 3]]
#
# [[0 1 2 3]
#  [0 1 2 3]
#  [0 1 2 3]
#  [0 1 2 3]]]

我们可以颠倒这些顺序(因为这是您希望在最终输出中使用的顺序),而unpack into a list 1 也包含src

然后zip列表中的所有元素以获得(col, row, val)三元组。我们可以使用numpy.column_stack将它们堆叠在一起。

list(zip(*[*reversed(np.indices(src.shape)), src]))
#[(array([0, 1, 2, 3]), array([0, 0, 0, 0]), array([2, 1, 5, 2])),
# (array([0, 1, 2, 3]), array([1, 1, 1, 1]), array([1, 4, 2, 1])),
# (array([0, 1, 2, 3]), array([2, 2, 2, 2]), array([4, 5, 5, 7])),
# (array([0, 1, 2, 3]), array([3, 3, 3, 3]), array([1, 5, 9, 3]))]

最后转置(numpy.ndarray.T)以获得最终输出。

注释

  1. 解压缩为list仅在python 3.5+中可用