2016-12-22 6 views
0

У меня есть 3d массив (давайте назовите его a) с помощью формы = (365, 28, 36). Я рассматриваю этот массив как трехмерный массив с 365 частями 2d массивов (28,36), уложенных друг на друга. Теперь я хочу пройти через этот трехмерный массив, и каждый 2d-фрагмент должен повторяться 8 раз, а затем складываться друг на друга. Это означает, что в итоге я получаю один массив размером (2920, 28, 36). 2920 - 365 * 8.Петля через 3d массив и добавьте 2d срезов N раз

Моя попытка была такой, но она не работает. Может ли кто-нибудь помочь с этой проблемой?

l = [] 
for i in range(365): 
    for j in range(28): 
     for k in range(30): 
      l.extend(repeat(a[i,j,k], 8)) 
+1

Можете ли вы поделиться образцом данных о трехмерном массиве, о котором вы говорите? –

+0

Да. Файл I cal a можно найти здесь. https://1drv.ms/f/s!AlJG9g1WlnmlhDC1WfgR1ljtI67E –

+0

«Это не работает» не является проблемой. Добро пожаловать в StackOverflow. Прочтите и следуйте инструкциям по отправке в справочной документации. [Минимальный, полный, проверяемый пример] (http://stackoverflow.com/help/mcve) применим здесь. Мы не можем эффективно помочь вам, пока вы не разместите свой код MCVE и не сможете точно описать проблему. – Prune

ответ

1
newarray = [] 
for arr2d in oldarray: 
    for _ in range(8): 
     newarray.append(arr2d) 

Массивы в питона, на самом деле списки, которые означают, что они имеют переменную длину, , так что вы можете просто сделать это. oldarray - ваш старый 3d массив, newarray - ваш желаемый результат, а arr2d - это 2-й массив внутри oldarray.

+0

Спасибо. Это решило мою проблему –

0

У вас есть несколько синтаксических ошибок в коде. Кроме того, я подозреваю, что вам нужно восемь независимых копий 2D-данных, а не 8 указателей на 2D-срез (где, если вы меняете одно значение, вы меняете их все).

Попробуйте это:

from copy import deepcopy 

a = [ 
    [[1, 2, 3], ['a', 'b', 'c']], 
    [[4, 5, 6], ['@', '#', '$']], 
    [[7, 8, 9], ['X', 'Y', 'Z']] 
    ] 

l = [] 
for slice in a: 
    l.extend([deepcopy(slice) for _ in range(8)]) 

l[0][0][0] = "FLAG" 
print l 

В заключительной печати, обратите внимание, как только одно изменение местоположение в строку «FLAG», а не все 8 копий этого среза меняется.