我有一个包含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]])
第三种情况:
>>> 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需要所有元素都是相同长度的数组,所以无法使用。
有没有一种简单的方法(最好只用一行代码)可以实现这个呢?
np.broadcast
返回一个迭代器。该迭代器返回元组,其中包含每个原始数组(或标量)中将被分组在一起进行逐元素操作的值。查看list(np.broadcast(np.arange(24).reshape(2,3,4), np.arange(3*4).reshape(3,4)))
返回的内容。它是一个由2元组组成的24个元素列表。它不像np.broadcast_arrays
那样显示单独广播的数组。它显示了逐元素配对。由于np.broadcast
返回的迭代器的性质,需要使用np.column_stack
来形成所需的数组。 - unutbunp.array(list(np.broadcast(....))
比np.vstack(np.broadcast(...))
更快。它不需要通过np.atleast_2d
传递数组。 - hpaulj