将新向量添加到numpy ndarray中

时间:2017-05-21 02:44:23

标签: python arrays numpy

我试图做一个项目,我想将一组向量保存到一个numpy数组中。

我想要一个像这样的数组:

[[[  2.52416655e+05  -3.39300988e+05  -1.47104728e+05]
  [  7.62810170e-02   4.71563079e-02   2.04445954e-02]]

 [[ -8.30154058e+10   1.11596039e+11   4.83823596e+10]
  [ -2.50869296e+04  -1.54980220e+04  -6.72001994e+03]]

 [[ -8.33917881e+10   1.11616209e+11   4.84208579e+10]
  [ -2.52465548e+04  -1.64620901e+04  -7.06724029e+03]]]

通过在开头使用这样的单个数组:

[[  2.52416655e+05  -3.39300988e+05  -1.47104728e+05]
 [ -8.30154058e+10   1.11596039e+11   4.83823596e+10]
 [ -8.33917881e+10   1.11616209e+11   4.84208579e+10]]

通过算法的每次迭代,我将向该数组添加一组新的向量。在第一次迭代之后,数组将像我在第一部分中显示的nd数组一样。

是否有任何numpy方法可以让我这样做?如果有更好的方法,请告诉我。非常感谢!!

3 个答案:

答案 0 :(得分:0)

如果您的数组是X,则可以执行以下操作

np.vstack([x[0] for x in X]) # loop and get first element

np.vstack(X)[0::2] # get even rows

答案 1 :(得分:0)

假设你从数组a:

开始
a
Out[891]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

你想追加数组b:

b
Out[892]: 
array([[ 9, 10, 11],
       [12, 13, 14],
       [15, 16, 17]])

您可以使用np.r_将它们合并到最终的数组'final',然后重新整形。

final = np.r_[a,b]

final.reshape((3,-1,3),order='F')
Out[898]: 
array([[[ 0,  1,  2],
        [ 9, 10, 11]],

       [[ 3,  4,  5],
        [12, 13, 14]],

       [[ 6,  7,  8],
        [15, 16, 17]]])

当你追加另一个数组c时,你也可以这样做:

c
Out[899]: 
array([[18, 19, 20],
       [21, 22, 23],
       [24, 25, 26]])

final = np.r_[final,c]

final.reshape((3,-1,3),order='F')
Out[901]: 
array([[[ 0,  1,  2],
        [ 9, 10, 11],
        [18, 19, 20]],

       [[ 3,  4,  5],
        [12, 13, 14],
        [21, 22, 23]],

       [[ 6,  7,  8],
        [15, 16, 17],
        [24, 25, 26]]])

答案 2 :(得分:0)

使用2个(或更多)相同形状的阵列,您可以在多个轴上连接它们,包括现有的水平或垂直轴。但是np.array在新的轴上加入了他们的开头'

In [429]: A = np.arange(9).reshape(3,3)
In [430]: B = np.arange(9,18).reshape(3,3)
In [431]: np.array([A,B])   # (2,3,3) array
Out[431]: 
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]]])

结果与我在三重嵌套列表中输入的结果相同。 np.stacknp.concatenate的新版本,可以执行相同的操作,也可以加入另一个新轴。我认为axis=1可以满足您的需求:

In [432]: np.stack([A,B], axis=1)   # a (3,2,3) array
Out[432]: 
array([[[ 0,  1,  2],
        [ 9, 10, 11]],

       [[ 3,  4,  5],
        [12, 13, 14]],

       [[ 6,  7,  8],
        [15, 16, 17]]])
In [433]: _[:,0,:]      # selecting from the 2nd axis to get A
Out[433]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

使用np.concatenate及其衍生物。

哦,如果你需要加入像这样的大量数组,最好在列表e.g.中收集它们[A,B,C,D,...] {{1}只堆一次。列表追加更适合迭代使用。

某些安排需要通过转置或轴交换进行进一步操作。但我不认为这里需要这样做。