我有一个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需要所有元素都是相同长度的数组。
是否有一些很好的方法(最好是单线)实现这个目标?
答案 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])]
然后在其上致电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]])
在这两个选项中(使用np.broadcast
或np.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]