[英]Matrix to Vector with python/numpy
如果我需要按行或按列创建矢量,Numpy ravel
效果很好。 但是,我想通过使用图像处理中经常使用的方法将矩阵转换为一维数组。 这是初始矩阵A
和最终结果B
的示例:
A = np.array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
B = np.array([[ 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15])
已经有一个现有的功能可以帮助我吗? 如果没有,您能给我一些如何解决这个问题的提示吗? PS。 矩阵A
为NxN
。
我已经使用numpy几年了,但从未见过这样的功能。
这是一种方法(不一定是最有效的方法):
In [47]: a
Out[47]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
In [48]: np.concatenate([np.diagonal(a[::-1,:], k)[::(2*(k % 2)-1)] for k in range(1-a.shape[0], a.shape[0])])
Out[48]: array([ 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15])
将单线分解为单独的步骤:
a[::-1, :]
,: a[::-1, :]
反转行:
In [59]: a[::-1, :]
Out[59]:
array([[12, 13, 14, 15],
[ 8, 9, 10, 11],
[ 4, 5, 6, 7],
[ 0, 1, 2, 3]])
(也可以将其写为a[::-1]
或np.flipud(a)
。)
np.diagonal(a, k)
提取第k
个对角线,其中k=0
是主对角线。 因此,例如
In [65]: np.diagonal(a[::-1, :], -3)
Out[65]: array([0])
In [66]: np.diagonal(a[::-1, :], -2)
Out[66]: array([4, 1])
In [67]: np.diagonal(a[::-1, :], 0)
Out[67]: array([12, 9, 6, 3])
In [68]: np.diagonal(a[::-1, :], 2)
Out[68]: array([14, 11])
在列表推导中, k
给出要提取的对角线。 我们要反转每个对角线中的元素。 表达式2*(k % 2) - 1
给出值1,-1,1,...,因为k
在-3到3之间变化。用[::1]
索引使数组的索引顺序保持不变,使用[::-1]
索引将反转数组的顺序。 所以np.diagonal(a[::-1, :], k)[::(2*(k % 2)-1)]
给出第k
个对角线,但其他对角线都被反转了:
In [71]: [np.diagonal(a[::-1,:], k)[::(2*(k % 2)-1)] for k in range(1-a.shape[0], a.shape[0])]
Out[71]:
[array([0]),
array([1, 4]),
array([8, 5, 2]),
array([ 3, 6, 9, 12]),
array([13, 10, 7]),
array([11, 14]),
array([15])]
np.concatenate()
将它们全部放入一个数组中:
In [72]: np.concatenate([np.diagonal(a[::-1,:], k)[::(2*(k % 2)-1)] for k in range(1-a.shape[0], a.shape[0])])
Out[72]: array([ 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15])
我发现了有关MATLAB的之字形扫描的讨论,但没有涉及numpy
。 一个项目似乎使用8x8块的硬编码索引数组
https://github.com/lot9s/lfv-compression/blob/master/scripts/our_mpeg/zigzag.py
ZIG = np.array([[0, 1, 5, 6, 14, 15, 27, 28],
[2, 4, 7, 13, 16, 26, 29, 42],
[3, 8, 12, 17, 25, 30, 41, 43],
[9, 11, 18, 24, 31, 40, 44,53],
[10, 19, 23, 32, 39, 45, 52,54],
[20, 22, 33, 38, 46, 51, 55,60],
[21, 34, 37, 47, 50, 56, 59,61],
[35, 36, 48, 49, 57, 58, 62,63]])
显然,它使用了jpeg和mpeg压缩。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.