2016-03-25 3 views
4

Im пытается получить диагональные (и антидиагональные) элементы многомерных объектов.Получите все диагонали (включая младшие) многомерного массива с numpy

Формы как (2,2), (3,3,3), (4,4,4,4), (5,5,5,5,5) и так далее. Я не думаю, что это слишком актуально.

Я нашел способы получить диагональные элементы, используя метод .diagonalndarray, но я не могу найти ничего, что могло бы вызвать у меня антидиагональное.

Так что я должен сделать это вручную?

[EDIT] Так

array([[[54, 81, 31], 
     [ 4, 83, 18], 
     [38, 32, 52]], 

     [[ 2, 45, 87], 
     [33, 20, 3], 
     [85, 31, 35]], 

     [[ 6, 11, 49], 
     [39, 76, 75], 
     [28, 52, 63]]]) 

Так что я хочу, "горизонтальные" диагоналей, как:

[54, 45, 49], 
[ 4. 20, 75], 
etc. 

, но тогда они также являются горизонтальными в некотором смысле

[ 6, 45, 31], 
[39, 20, 18] 

, а затем «вертикальные»:

[54, 33, 28], 
[81, 20, 52], 
etc. 

но это также вертикальная:

[6, 33, 38], 
[11, 20, 32] 

и этот один, но вы бы назвали это

[54, 20, 63] 

, а затем они также "длинные" диагоналей, как предыдущий (более длинный в геометрическом смысле, если вы думаете о матрице как трехмерной геометрической структуре, причем числа размещаются на вершинах куба и на середине линий между ними)

[38, 20, 49], 
[6, 20, 52] 

Тогда, небольшая диагональ будет один, который идет справа налево или снизу вверх (но не оба одновременно) в этой матрице, что-то вроде:

[31, 45, 6], 
[31, 83, 38] # this is the first classical anti-diagonal in the first matrix 

Конечно , Я не использовал здесь все диагонали, но это мое требование. Мне не нужны диагонали, которые смещены от любой из основных/антидиагоналей.

Если вы также знаете, что это невозможно, сообщите, потому что я сделаю это вручную.

+1

Список входной образец и ожидаемый выход для многомерного случая массива, как '(3,3,3) '? – Divakar

+0

Какова (основная и анти) диагональ трехмерных или четырехмерных массивов? Потому что их много – JeD

+0

@ Дивакар Да ... Я хочу всех. Я хочу все возможные диагонали. Я пытаюсь построить многомерную версию tic-tac-toe –

ответ

1

Если вы хотите диагональ от corner1 до corner2 и определить углы в виде

(0,0,0,...,0) , (0,0,0,....,1),...,(1,1,1,...,1)

где 0 означает «Это измерение при 0» и 1 означает "Это измерение в - 1/end "

тогда это вернет значения, которые вы получаете, перейдя от corner1 в corner2, считая, что массив имеет одинаковый размер в каждом измерение.

import numpy 
def diagonal(arr,corner1,corner2): 
    arr=numpy.array(arr) 
    #Change values to fit array 
    corner1Copy=(len(arr)-1)*numpy.array(corner1) 
    corner2Copy=(len(arr)-1)*numpy.array(corner2) 

    #create return array by running from corner1 to corner2 and returning the values 
    return [arr[tuple((i*corner2Copy+(len(arr)-i-1)*corner1Copy)/(len(arr)-1))] for i in range(len(arr))] 

Вот два небольших Тестовые но я хотел бы предложить создать еще, в случае, если я что-то пропустил:

arr=[[[i+j+k for i in range(5)]for j in range(5)] for k in range(5)] 
corner1=[0,0,0] 
corner2=[1,1,1] 

#returns arr[0,0,0],arr[1,1,1],....,arr[-1,-1,-1] 
print(diagonal(arr,corner1,corner2)) 
print([arr[i][i][i] for i in range(len(arr))]) 

arr2=[[i+j for i in range(5)]for j in range(5)] 

corner12=[0,1] 
corner22=[1,1] 
#return arr[0,-1],arr[1,-1],....,arr[-1,-1] 
print(diagonal(arr2,corner12,corner22)) 
print([arr2[i][-1] for i in range(len(arr2))]) 
Смежные вопросы