让我们说我有这样的: (numpy的阵列)逆转numpy的蟒蛇对角线
a=
[0 1 2 3],
[4 5 6 7],
[8 9 10 11]
得到[1,1],这是5对角为零;根据numpy,a.diagonal(0)= [0,5,10]
。如何获得[1,1]的反向或从左到右的对角线[2,5,8]?这可能吗? 我原来的问题是一个8乘8(0:7)..我希望可以帮助
让我们说我有这样的: (numpy的阵列)逆转numpy的蟒蛇对角线
a=
[0 1 2 3],
[4 5 6 7],
[8 9 10 11]
得到[1,1],这是5对角为零;根据numpy,a.diagonal(0)= [0,5,10]
。如何获得[1,1]的反向或从左到右的对角线[2,5,8]?这可能吗? 我原来的问题是一个8乘8(0:7)..我希望可以帮助
获取一个新的数组,每行颠倒。
>>> import numpy as np
>>> a = np.array([
... [0, 1, 2, 3],
... [4, 5, 6, 7],
... [8, 9, 10, 11]
... ])
>>> a[:, ::-1]
array([[ 3, 2, 1, 0],
[ 7, 6, 5, 4],
[11, 10, 9, 8]])
>>> a[:, ::-1].diagonal(1)
array([2, 5, 8])
或使用numpy.fliplr
:
>>> np.fliplr(a).diagonal(1)
array([2, 5, 8])
注意一般情况下,这需要计算数组另一端的偏移量,例如:你需要在计算中使用'a.shape' – wim
@wim,你说得对。你的回答在这个问题上更加优雅。感谢您的评论。 +1 – falsetru
在我的程序中,我不知道对角函数中的“1”?我如何获得? – MasterWizard
翻转阵列倒置,并使用相同:
np.flipud(a).diagonal(0)[::-1]
另一种方式来实现,这是使用np.rot90
import numpy as np
a = np.array([[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9, 10, 11]])
my_diag = np.rot90(a).diagonal(-1)
结果:
>>> my_diag
array([2, 5, 8])
到目前为止的答案有很多。 @Akavall是最接近你需要旋转或filip和转置(equivilant操作)。我没有看到任何关于矩形“长”部分的预期行为的回复。
对于正方形矩阵的广义溶液:
a = array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
>>> [(i, np.rot90(a).diagonal(2*i-a.shape[0]+1)) for i in range(a.shape[0])]
[(0, array([0])),
(1, array([ 2, 6, 10])),
(2, array([ 4, 8, 12, 16, 20])),
(3, array([14, 18, 22])),
(4, array([24]))]
作为功能:
def reverse_diag(arr, n):
idx = 2*n - arr.shape[0]+1
return np.rot90(arr).diagonal(idx)
原始矩阵可以由正方形,a[:np.min(a.shape),:np.min(a.shape)]
EDIT:OP表示的阵列是正方形.... 最终答案就是上面的
有两个答案出现不够一般化,因为你的样本很小。你想要[2,2]的答案是[7,10]吗?相关的问题,你可以在另一个方向矩形(高不宽)? –
我的例子是一个8乘8(0:7)..我希望帮助 – MasterWizard