我有一个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需要所有元素都是相同长度的数组.
实现这一目标是否有一些不错的方式(最好是单线程)?
您可以创建广播对象,并调用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.broadcast或np.broadcast_arrays)中,
np.broadcast更快,因为您实际上不需要实例化广播的子阵列.
np.broadcast然而,一个限制是它最多可以接受32个参数.在那种情况下,使用np.broadcast_arrays.