如何在numpy中堆叠数组和标量?

时间:2016-03-27 21:22:28

标签: python numpy

我有一个numpy向量(1-D数组)或标量列表(即只是数字)。所有的载体都有相同的长度,但我不知道那是什么。我需要vstack所有元素来创建一个矩阵(2-D数组),使得标量被视为在每个位置具有标量的向量。

示例是最佳描述:

案例1:

>>> np.vstack([np.array([1, 2, 3]), np.array([3, 2, 1])])
array([[1, 2, 3],
       [3, 2, 1]])

案例2:

>>> np.vstack([1, 2])
array([[1],
       [2]])

案例3:

>>> np.vstack([np.array([1, 2, 3]), 0, np.array([3, 2, 1])])
np.array([[1, 2, 3],
          [0, 0, 0],
          [3, 2, 1]])

案例1和案例2开箱即用。但是,在情况3中,它并不像vstack需要所有元素都是相同长度的数组。

是否有一些很好的方法(最好是单线)实现这个目标?

3 个答案:

答案 0 :(得分:8)

您可以create broadcast object,并在其上致电np.column_stack

In [175]: np.column_stack(np.broadcast([1, 2, 3], 0, [3, 2, 1]))
Out[175]: 
array([[1, 2, 3],
       [0, 0, 0],
       [3, 2, 1]])

或者,您可以向NumPy询问literally broadcast项目为兼容形状的数组:

In [158]: np.broadcast_arrays([1, 2, 3], [3, 2, 1], 0)
Out[158]: [array([1, 2, 3]), array([3, 2, 1]), array([0, 0, 0])]

然后在其上致电vstackrow_stack

In [176]: np.row_stack(np.broadcast_arrays([1, 2, 3], 0, [3, 2, 1]))
Out[176]: 
array([[1, 2, 3],
       [0, 0, 0],
       [3, 2, 1]])

在这两个选项中(使用np.broadcastnp.broadcast_arrays), np.broadcast更快,因为您实际上并不需要实例化 广播的子阵列。

np.broadcast的一个限制是它最多可以接受32 参数。在这种情况下,请使用np.broadcast_arrays

答案 1 :(得分:1)

这里的问题是填补可读的python世界和高效的numpy世界之间的空白。

实验上,对于这项任务来说,python通常更好地为numpy做好准备。使用l=[ randint(10) if n%2 else randint(0,10,100) for n in range(32)]

In [11]: %timeit array([x if type(x) is ndarray else [x]*100 for x in l])
1000 loops, best of 3: 655 µs per loop

In [12]: %timeit column_stack(broadcast(*l))
100 loops, best of 3: 3.77 ms per loop

此外,广播仅限于32个元素。

答案 2 :(得分:0)

不是一个班轮,但你可以用标量填充一个空数组。

>>> a = np.empty(4, dtype=int )
>>> a.fill(2)
>>> print(a)
[2 2 2 2]