如何创建一个数组值沿着指定的轴?



numpy.full()是一个很好的函数,它允许我们生成特定形状和值的数组。例如,

>>>np.full((2,2),[1,2])
array([[1,2],
[1,2]])

但是,它没有一个内置的选项来沿着特定的轴应用值。因此,下面的代码不能工作:

>>>np.full((2,2),[1,2],axis=0)
array([[1,1],
[2,2]])

因此,我想知道如何创建一个10x48x271x397多维数组,其值[1,2,3,4,5,6,7,8,9,10]插入轴=0?换句话说,就是一个数组,它的[1,2,3,4,5,6,7,8,9,10]沿着第一维轴重复。是否有一种方法可以使用numpy.full()或其他方法来做到这一点?

#Does not work, no axis argument in np.full()
values=[1,2,3,4,5,6,7,8,9,10]
np.full((10, 48, 271, 397), values, axis=0)

编辑:添加来自Michael Szczesny的想法

import numpy as np
shape = (10, 48, 271, 397)
root = np.arange(shape[0])

您可以使用np.fullnp.broadcast_to(仅在创建时获得视图):

arr1 = np.broadcast_to(root, shape[::-1]).T
arr2 = np.full(shape[::-1], fill_value=root).T
%timeit np.broadcast_to(root, shape[::-1]).T
%timeit np.full(shape[::-1], fill_value=root).T
# 3.56 µs ± 18.2 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
# 75.6 ms ± 243 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

而不是把形状和数组反过来,你可以使用单维,但它似乎不太通用:

root = root[:, None, None, None]
arr3 = np.broadcast_to(root, shape)
arr4 = np.full(shape, fill_value=root)
root = np.arange(shape[0])
%timeit root_ = root[:, None, None, None]; np.broadcast_to(root_, shape)
%timeit root_ = root[:, None, None, None]; np.full(shape, fill_value=root_)
# 3.61 µs ± 6.36 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
# 57.5 ms ± 114 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

检查所有内容是否相等,是否符合我们的要求:

assert arr1.shape == shape
for i in range(shape[0]):
sub = arr1[i]
assert np.all(sub == i)
assert np.all(arr1 == arr2)
assert np.all(arr1 == arr3)
assert np.all(arr1 == arr4)

最新更新