【问题标题】:Creating 3D Array in Python在 Python 中创建 3D 数组
【发布时间】:2020-06-10 11:35:51
【问题描述】:

我正在尝试通过在 Python 中填充 2D 数组来形成 3D 数组。 N 是一个数字,取决于正在读取的文件。矩阵正在形成为 3D,但当我期望它有 N 层时,它似乎只有 1 个“层”。似乎 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)

【问题讨论】:

  • 您期望的形状是什么? 1 条目可能会导致问题,因为数组现在具有长度为 N 和整数的向量。尝试np.array([1]*N) 得到一个与其他元素形状相同的 1 向量。
  • 你看arr了吗?或arr.dtype。不要只看shape,尤其是形状出乎意料的时候。
  • 初始大小1维由[]的外层产生。
  • 您可能需要转置才能将 N 维放在首位。

标签: python arrays numpy matrix


【解决方案1】:

让我们简化案例,看看实际结果,而不仅仅是形状。

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)

注意形状和数据类型(int like 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)

dtype 已更改。它现在是数组和标量元素的混合体。

用匹配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)

【讨论】:

    【解决方案2】:

    您没有准确说出您期望的形状。下面的代码将返回一个形状为(3, 3, N)的3D数组

    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)
    

    【讨论】:

      猜你喜欢
      • 2012-05-26
      • 1970-01-01
      • 2021-04-10
      • 2021-10-07
      • 2018-07-28
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多