从numpy数组的最后一个轴提取值

vcudknz3  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(130)

考虑一个形状为(3,)的numpy数组A。那么下面这行

x,y,z = A

x分配给A[0],将y分配给A[1],将z分配给A[2]。假设现在A的形状为s + (3,),而任意形状为s。我想类似地将x分配给A[...,0],将y分配给A[...,1],将z分配给A[...,2]。上面那行

x,y,z = A

不起作用,并给出ValueError:没有足够的值来解包(预期值为3,得到值为2)[当A具有形状(2,3)时]。我如何以一种干净的方式完成所需的任务?显然以下

x,y,z = A[...,0], A[...,1], A[...,2]

工作,但如果3被某个大数字取代,则有点乏味。

8i9zcol2

8i9zcol21#

可以使用numpy.rollaxis

x, y, z = np.rollaxis(A, -1)

假设此输入:

array([[[0, 1, 2],
        [3, 4, 5]]])

输出:

# x, y, z
(array([[0, 3]]), array([[1, 4]]), array([[2, 5]]))

这适用于任何位置,只需指定要用作rollaxis的第二个参数的尺寸:

x, y, z = np.rollaxis(A, 2)
计时:

shape = (7,6,8,2,1,4,5,9,3) ; A = np.arange(np.prod(shape)).reshape(shape)作为输入。

%timeit x, y, z = np.rollaxis(A, -1)
# 1.96 µs ± 59 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

%timeit x, y, z = np.moveaxis(A, -1, 0)
# 3.78 µs ± 298 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)

# credit to @QuangHoang
%timeit x, y, z = [A[...,i] for i in range(3)]
# 691 ns ± 8.24 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

相关问题