更改numpy数组的形状

时间:2018-07-07 08:04:11

标签: python numpy

我有n个形状数组

(86,) 

我有一个空数组

complete = np.array([])

我要将这些n数组附加到其上。当我现在使用它时

complete = np.append(complete, feature_1)

当我继续将数组形状更改附加到(172,)(258) ...等时,但是我想以这样的方式添加,使其像这样(1, 86),{ {1}},(2, 86)等。最终的形状是我想要的(3, 86)

任何有关如何实现此目标的建议都会有所帮助。预先感谢。

1 个答案:

答案 0 :(得分:2)

我想您最好创建一个空的2D数组并在以后填充它...

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]: