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

zeg*_*jan 5 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]])
Run Code Online (Sandbox Code Playgroud)

案例2:

>>> np.vstack([1, 2])
array([[1],
       [2]])
Run Code Online (Sandbox Code Playgroud)

案例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]])
Run Code Online (Sandbox Code Playgroud)

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

实现这一目标是否有一些不错的方式(最好是单线程)?

unu*_*tbu 8

您可以创建广播对象,并调用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]])
Run Code Online (Sandbox Code Playgroud)

或者,你可以让NumPy将这些项目直接广播到兼容形状的数组:

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])]
Run Code Online (Sandbox Code Playgroud)

然后打电话vstack或打电话row_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]])
Run Code Online (Sandbox Code Playgroud)

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

np.broadcast然而,一个限制是它最多可以接受32个参数.在那种情况下,使用np.broadcast_arrays.