如何找到二维矩阵的两条对角线?

3

假设有一个3行3列的numpy矩阵。找到第一个对角线很容易,这是一个方法。

以下是示例矩阵:

[[0,3,6]

 [0,4,9]

 [0,1,9]]

使用以下代码:

import numpy
matrix.diagonals()
[0, 4, 9]

如何获得对角线的相反方向?例如,对于上面的矩阵,我希望它返回:

[6, 4, 0]
4个回答

4

实现这一目标最快的方法是使用步幅。您的数组具有一个.strides属性,该属性告诉您在每个维度中要跳过多少字节才能到达下一个项目:

>>> a = np.array([[0, 3, 6], [0, 4, 9], [0, 1, 9]])
>>> a.strides
(24, 8)

正斜线需要跳过一行加一列,反斜线需要跳过一行减一列:

>>> a.strides[0] + a.strides[1]
32
>>> a.strides[0] - a.strides[1]
16

现在,您可以使用相同的内存缓冲区构造一个数组,但是具有新的步幅(并且在反对角线情况下从第一行的最后一列开始的非零偏移量):构造
>>> np.ndarray(shape=min(a.shape), dtype=a.dtype, buffer=a, 
...            offset=0, strides=a.strides[0]+a.strides[1])
array([0, 4, 9])
>>> np.ndarray(shape=min(a.shape), dtype=a.dtype, buffer=a, 
...            offset=a.strides[1] * (a.shape[1] - 1),
...            strides=a.strides[0]+a.strides[1])
array([6, 4, 0])

实际上,这些是对原数组内存的视图。也就是说,如果您修改它们的内容,原始数组也会发生更改。因此,几乎没有进行任何内存分配或复制,只需设置包含对象,所以它将非常快速。


2
我想这样做就可以了:
In [29]: mm
Out[29]:
matrix([[0, 3, 6],
        [0, 4, 9],
        [0, 1, 9]])

In [30]: np.fliplr(mm)
Out[30]:
matrix([[6, 3, 0],
        [9, 4, 0],
        [9, 1, 0]])

In [31]: mm.diagonal()
Out[31]: matrix([[0, 4, 9]])

In [33]: np.fliplr(mm).diagonal()
Out[33]: matrix([[6, 4, 0]])

2
你可以按照以下步骤进行:
(1) 反转矩阵, (2) 获取对角线, (3) 反转对角线。
import numpy

a = numpy.matrix([[0, 3, 6], [0, 4, 9], [0, 1, 9]])
print(numpy.diag(a))
print(numpy.diag(a[::-1])[::-1])

output:

[0 4 9]
[6 4 0]

1
In [240]: M=np.arange(9).reshape(3,3)

主对角线是M[i,j]当i==j,我们可以使用相同的数组进行高级索引以获取i和j的值。
In [241]: i=np.arange(3)

In [242]: M[i,i]
Out[242]: array([0, 4, 8])

通过反转j的顺序,我们可以得到另一条对角线。
In [243]: M[i,i[::-1]]
Out[243]: array([2, 4, 6])

我怀疑对于大数组,像这样反转索引比翻转矩阵更快。但我们需要进行一些计时来确保。

===========

糟糕,我错了。 M.diagonal() 比我的显式索引快得多。对于 N=1000

In [259]: timeit M.diagonal();np.fliplr(M).diagonal()
100000 loops, best of 3: 3.63 µs per loop

In [260]: timeit i=np.arange(N);mm=M[i,i],M[i,i[::-1]]
10000 loops, best of 3: 51.3 µs per loop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接