在额外维度上扩展给定NumPy数组的最简单方法是什么?
例如,假设我有
>>> np.arange(4)
array([0, 1, 2, 3])
>>> _.shape
(4,)
>>> expand(np.arange(4), 0, 6)
array([[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3]])
>>> _.shape
(6, 4)
或者这个,有点复杂:
>>> np.eye(2)
array([[ 1., 0.],
[ 0., 1.]])
>>> _.shape
(2, 2)
>>> expand(np.eye(2), 0, 3)
array([[[ 1., 0.],
[ 0., 1.]],
[[ 1., 0.],
[ 0., 1.]],
[[ 1., 0.],
[ 0., 1.]]])
>>> _.shape
(3, 2, 2)
答案 0 :(得分:5)
我建议np.tile。
>>> a=np.arange(4)
>>> a
array([0, 1, 2, 3])
>>> np.tile(a,(6,1))
array([[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3]])
>>> b= np.eye(2)
>>> b
array([[ 1., 0.],
[ 0., 1.]])
>>> np.tile(b,(3,1,1))
array([[[ 1., 0.],
[ 0., 1.]],
[[ 1., 0.],
[ 0., 1.]],
[[ 1., 0.],
[ 0., 1.]]])
在许多方面扩展也很容易:
>>> np.tile(b,(2,2,2))
array([[[ 1., 0., 1., 0.],
[ 0., 1., 0., 1.],
[ 1., 0., 1., 0.],
[ 0., 1., 0., 1.]],
[[ 1., 0., 1., 0.],
[ 0., 1., 0., 1.],
[ 1., 0., 1., 0.],
[ 0., 1., 0., 1.]]])
答案 1 :(得分:1)
我认为修改数组的步幅可以很容易地编写expand
:
def expand(arr, axis, length):
new_shape = list(arr.shape)
new_shape.insert(axis, length)
new_strides = list(arr.strides)
new_strides.insert(axis, 0)
return np.lib.stride_tricks.as_strided(arr, new_shape, new_strides)
该函数返回原始数组的视图,不占用额外的内存。
与新轴对应的stride为0,因此无论该轴的索引值是否保持不变,基本上都会为您提供所需的行为。