代码之家  ›  专栏  ›  技术社区  ›  Ryan

更改numpy数组的形状

  •  0
  • Ryan  · 技术社区  · 7 年前

    我有 n 形状阵列

    (86,) 
    

    我有一个空数组

    complete = np.array([])
    

    我想加上这些 n个 阵列。当我用这个做的时候

    complete = np.append(complete, feature_1)
    

    当我继续将数组形状更改附加到 (172,) 我是说, (258) …等等,但我想这样附加 (1, 86) 我是说, (2, 86) 我是说, (3, 86) 等。。最终得到我想要的形状 (n, 86) 是的。

    任何关于我如何能做到这一点的建议都是有帮助的。提前谢谢。

    1 回复  |  直到 7 年前
        1
  •  2
  •   gboffi    7 年前

    我想你最好创建一个空的二维数组,稍后再填充它…

    import numpy as np
    
    N = how_many()
    L = how_long()
    
    complete = np.empty((N, L), dtype=float)
    
    for i in range(N):
        complete(i, :) = extract_feature(i)
    

    代替 dtype=float 根据问题的需要,可以使用不同的数字类型。

    例如。,

    In [14]: a = np.empty((2,4), dtype=float)
    
    In [15]: for i in (0, 1):
        ...:     a[i,:] = np.ones(4)*i
        ...:     
    
    In [16]: a
    Out[16]: 
    array([[0., 0., 0., 0.],
           [1., 1., 1., 1.]])
    

    附录

    论效率 如果事先知道数组的维数,他们将一行一行地构造数组,那么上面的方法更好,因为它经常避免 全部查找新内存,将临时结果和新行复制到新内存,并释放用于保存上一个临时结果的内存。

    使用连接的替代方法 另一方面,如果一个人事先不知道在创建数组的过程中会产生多少行,或者坚持使用次优解, 他们可以使用 np.vstack 我是说, 将新行的结果封装在 发电机

    import numpy as np
    
    def features_factory(stuff):
        while true:
            feature = new_feature(stuff)
            if feature:
                yield feature
            else:
                return
    
    complete = np.vstack(features_factory(todays_stuff))
    

    例如。,

    In [1]: import numpy as np
    
    In [2]: np.random.seed((2018+7+8)) # today's stuff... ;)
    
    In [3]: def features_factory(stuff):
       ...:     n = 0
       ...:     while True:
       ...:         if n<stuff:
       ...:             yield np.ones(5)*n
       ...:             n = n+1
       ...:         else:
       ...:             return        
    
    In [4]: complete = np.vstack(features_factory(np.random.randint(5,11)))
    
    In [5]: complete
    Out[5]: 
    array([[0., 0., 0., 0., 0.],
           [1., 1., 1., 1., 1.],
           [2., 2., 2., 2., 2.],
           [3., 3., 3., 3., 3.],
           [4., 4., 4., 4., 4.],
           [5., 5., 5., 5., 5.],
           [6., 6., 6., 6., 6.],
           [7., 7., 7., 7., 7.]])
    
    In [6]: