numpy数组与每个数组的额外列连接

时间:2018-03-09 18:04:35

标签: numpy

我尝试将numPy数组拆分成大致相等的部分,并将它们合并为一个额外的值,但最终会混淆我是如何做到这一点的。我有一个列表:[0。,2.25,4.4,4,4,4,4,4,4,2.5],它们在np.array_split之后与一个额外的列连接应该会结束喜欢:[0。 ,2.25,4.,8.,4.,4.,4.,8.,4.,4.,8.,4.,2.25]

我采取的步骤:

>>> import numpy as np
>>> list = [0., 2.25, 4., 4., 4., 4., 4., 4., 4., 2.25]
>>> x = np.array(list)
>>> print(x)
[0.   2.25 4.   4.   4.   4.   4.   4.   4.   2.25]
>>> x = np.array_split(list, 4)
>>> print(x)
[array([0.  , 2.25, 4.  ]), array([4., 4., 4.]), array([4., 4.]), 
array([4.  , 2.25])]
>>> x = np.concatenate([x, 8])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: all the input arrays must have same number of dimensions

当我将数组保持为相同的形状时,它会将它添加到列表的末尾

>>> x = np.concatenate([[x, y]])
>>> print(x)
[list([array([0.  , 2.25, 4.  ]), array([4., 4., 4.]), array([4., 
4.]), array([4.  , 2.25])])
 list([8])]

我知道这样做可能更容易,如果你知道单个数组的形状,那么你可以添加一个单值为8的额外列,但是array_split没有看到相同的大小上方。

我是否会错过这里的一步,是否有可能实现我想要的目标?

2 个答案:

答案 0 :(得分:0)

你能不能只做

np.insert(list, [3,6,8],[8])
array([ 0.  ,  2.25,  4.  ,  8.  ,  4.  ,  4.  ,  4.  ,  8.  ,  4.  ,
        4.  ,  8.  ,  4.  ,  2.25,  8.  ])

np.array_split生成一个split数组列表。因此,要获得所需的结果,您必须这样做

[np.concatenate((i,[8])) for i in x]

[array([ 0.  ,  2.25,  4.  ,  8.  ]),
 array([ 4.,  4.,  4.,  8.]),
 array([ 4.,  4.,  8.]),
 array([ 4.  ,  2.25,  8.  ])]

答案 1 :(得分:0)

In [71]: alist = [0., 2.25, 4., 4., 4., 4., 4., 4., 4., 2.25]
In [72]: x = np.array(alist)
In [73]: xs = np.array_split(x, 4)
In [75]: xs
Out[75]: 
[array([0.  , 2.25, 4.  ]),
 array([4., 4., 4.]),
 array([4., 4.]),
 array([4.  , 2.25])]

xs是不同大小的数组列表; concatenate可以在他们的1维上加入他们,重新创建x

In [76]: np.concatenate(xs)
Out[76]: array([0.  , 2.25, 4.  , 4.  , 4.  , 4.  , 4.  , 4.  , 4.  , 2.25])

注意当我尝试从xs创建数组时会发生什么:

In [77]: np.array(xs)
Out[77]: 
array([array([0.  , 2.25, 4.  ]), array([4., 4., 4.]), array([4., 4.]),
       array([4.  , 2.25])], dtype=object)

结果是一个1d对象dtype数组,包含那些数组。但如果拆分产生相同大小的数组,结果将是2d

In [79]: np.array_split(x,5)
Out[79]: 
[array([0.  , 2.25]),
 array([4., 4.]),
 array([4., 4.]),
 array([4., 4.]),
 array([4.  , 2.25])]
In [80]: np.array(np.array_split(x,5))
Out[80]: 
array([[0.  , 2.25],
       [4.  , 4.  ],
       [4.  , 4.  ],
       [4.  , 4.  ],
       [4.  , 2.25]])

np.concatenate([xs, 8])实际上是np.concatenate([np.array(xs), np.array(8)]),加入带有0d整数数组的1d对象数组。因此尺寸误差。

要生成所需的数组,需要将8添加到所需的数组,然后连接。

In [84]: for i,v in enumerate(xs[:-1]):
    ...:     xs[i] = np.concatenate([v,[8]])
    ...:     
In [85]: xs
Out[85]: 
[array([0.  , 2.25, 4.  , 8.  ]),
 array([4., 4., 4., 8.]),
 array([4., 4., 8.]),
 array([4.  , 2.25])]
In [86]: np.concatenate(xs)
Out[86]: 
array([0.  , 2.25, 4.  , 8.  , 4.  , 4.  , 4.  , 8.  , 4.  , 4.  , 8.  ,
       4.  , 2.25])

或者向所有人添加8,并在连接后删除最后8个。