Создание 3D-массива в Python - PullRequest
       7

Создание 3D-массива в Python

0 голосов
/ 26 февраля 2020

Я пытаюсь сформировать трехмерный массив в Python, заполнив его двумерными массивами. N - это число, которое изменяется в зависимости от читаемого файла. Матрица формируется как 3D, но кажется, что она имеет 1 «слой», когда я ожидаю, что в ней будет N слоев. Похоже, что число N слоев не передается в сформированный массив.

import numpy as np

#'rot' is a 3D matrix of shape (N,3,3)
a=np.array(rot[:,0,0])
b=np.array(rot[:,0,1])
c=np.array(rot[:,0,2])
d=np.array(rot[:,1,0])
e=np.array(rot[:,1,1])
f=np.array(rot[:,1,2])
g=np.array(rot[:,2,0])
h=np.array(rot[:,2,1])
i=np.array(rot[:,2,2])  

print(a.shape)
#(N,)

#Forming 3D array
arr=np.array([[[a,b,1],
               [d,e,1],
               [g,h,i]]])

print(arr.shape)
#(1,3,3)

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Давайте упростим случай и посмотрим на фактические результаты, а не только на форму.

In [327]: a=np.arange(4)  

Создайте массив из этого массива (или других подобных ему)

In [328]: np.array([[[a,a],[a,a]]])                                                            
Out[328]: 
array([[[[0, 1, 2, 3],
         [0, 1, 2, 3]],

        [[0, 1, 2, 3],
         [0, 1, 2, 3]]]])
In [329]: _.shape                                                                              
Out[329]: (1, 2, 2, 4)

Обратите внимание на форму и тип d (например, a). Но когда мы добавляем к смеси скаляр 1:

In [330]: np.array([[[a,a,1],[a,a,1]]])                                                        
Out[330]: 
array([[[array([0, 1, 2, 3]), array([0, 1, 2, 3]), 1],
        [array([0, 1, 2, 3]), array([0, 1, 2, 3]), 1]]], dtype=object)
In [331]: _.shape                                                                              
Out[331]: (1, 2, 3)

Тип d изменился. Теперь это смесь массивов и скалярного элемента.

Замена скаляра на массив, который соответствует a:

In [332]: ones=np.ones_like(a)                                                                 
In [333]: ones                                                                                 
Out[333]: array([1, 1, 1, 1])
In [334]: np.array([[[a,a,ones],[a,a,ones]]])                                                  
Out[334]: 
array([[[[0, 1, 2, 3],
         [0, 1, 2, 3],
         [1, 1, 1, 1]],

        [[0, 1, 2, 3],
         [0, 1, 2, 3],
         [1, 1, 1, 1]]]])
In [335]: _.shape           
Out[335]: (1, 2, 3, 4)

и без внешнего слоя []

In [356]: np.array([[a,a,ones],[a,a,ones]])                                                    
Out[356]: 
array([[[0, 1, 2, 3],
        [0, 1, 2, 3],
        [1, 1, 1, 1]],

       [[0, 1, 2, 3],
        [0, 1, 2, 3],
        [1, 1, 1, 1]]])
In [357]: _.shape                                                                              
Out[357]: (2, 3, 4)

Если вы хотите размер N (здесь 4), вы можете транспонировать

  arr.transpose(2,0,1)
0 голосов
/ 26 февраля 2020

Вы не говорите точно, какую форму вы ожидаете. Код ниже вернет трехмерный массив формы (3, 3, N)

ones_vec = np.array([1] * N)

arr = np.array([[a, b, ones_vec], 
                [d, e, ones_vec], 
                [g, h, h]])
print(arr.shape)
# (3, 3, N)
...