Skip to main content
 首页 » 编程设计

python之矩阵到矢量与 python/numpy

2025年05月04日26zfyouxi

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]) 

是否已经有可以帮助我的现有功能?如果没有,你能给我一些关于如何解决这个问题的提示吗?附言。矩阵 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, :] 反转行:

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])