2015-02-19 5 views
0

Я пытаюсь создать 3D-массив на python с помощью Numpy и умножить 2D-массив на 3-е измерение. Я довольно новичок в многомерных массивах Numpy, и в основном я пропускаю что-то важное здесь.Построение 3D-массива из базового 2D-массива - Numpy

В этом примере я пытаюсь создать 3D-массив размером 10x10x20, используя базовый 2D-массив (10x10), скопировав его 20 раз.

Мой исходный 2D массив:

a = zeros(10,10) 
for i in range(0,9): 
    a[i+1, i] = 1 

То, что я пытался создать 3D-массив:

b = zeros(20) 
for i in range(0,19): 
    b[i]=a 

Этот подход, вероятно, глупо. Итак, каков правильный подход к построению 3D-массивов из базовых 2D-массивов?

Cheers.

Редактировать Ну, я делал что-то неправильно, возможно, из-за моего фона R.

Вот как я это сделал, наконец

b = zeros(20*10*10) 
b = b.reshape((20,10,10)) 
for i in b: 
    for m in range(0, 9): 
     i[m+1, m] = 1 

Есть ли другие способы сделать то же самое?

ответ

1

Существует множество способов построения многомерных массивов.

Если вы хотите построить 3D массив из данных 2D массивов вы можете сделать что-то вроде

import numpy 

# just some 2D arrays with shape (10,20) 
a1 = numpy.ones((10,20)) 
a2 = 2* numpy.ones((10,20)) 
a3 = 3* numpy.ones((10,20)) 

# creating 3D array with shape (3,10,20) 
b = numpy.array((a1,a2,a3)) 

В зависимости от ситуации, существуют и другие способы, которые быстрее. Однако, пока вы используете встроенные конструкторы вместо петель, вы находитесь на быстрой стороне.

для вашего конкретного примера в Edit я хотел бы использовать numpy.tri

c = numpy.zeros((20,10,10)) 
c[:] = numpy.tri(10,10,-1) - numpy.tri(10,10,-2) 
+0

Благодарим за сообщение :) – Domagoj

1

Наткнулся подобной проблемой ...

мне нужно изменить 2D массив в 3D массив таким образом: (y, x) -> (y, x, 3). Вот пара решений для этой проблемы.

Решение 1

Используя инструмент питон набор

array_3d = numpy.zeros(list(array_2d.shape) + [3], 'f') 
for z in range(3): 
    array_3d[:, :, z] = array_2d.copy() 

Решение 2

Использование NumPy набор инструментов

array_3d = numpy.stack([array_2d.copy(), ]*3, axis=2) 

Вот что я придумал. Если кто-то знает numpy, чтобы дать лучшее решение, я бы с удовольствием его увидел! Это работает, но я подозреваю, что есть лучший способ повысить производительность.

Смежные вопросы