假设我有数组:
[[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))
答案 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
)以获得最终输出。
注释:
list
仅在python 3.5+中可用