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

标签 python numpy numpy-ndarray

考虑一个形状为 (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 ]zA[...,2]。上面一行

x,y,z = A

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

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

可以工作,但如果将 3 替换为某个大数字,则有点乏味。

最佳答案

您可以使用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)

时间:

形状 = (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)

关于python - 从 numpy 数组的最后一个轴提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76156188/

相关文章:

Python - 完全相同的循环工作不一致 'int'对象不可迭代 - 不迭代 int

python - 数组 dtype ('|S58' 中竖线的含义是什么)

python - 如何添加另一个数据框的索引

python - ReLU 阈值处理中 numpy.ceil 和 numpy.clip 的速度缓慢 : where is the bottleneck?

python - 填充数组中按行、列索引偏移的对角线和反对角线 - NumPy/Python

python - 使用 numpy 在第一个矩阵列中搜索数组并获取下一列值

numpy - PyTorch - 到 NumPy 会产生未确定大小的对象?

python - 将 QWizardPage 的 QPushButton 与 QWizard 的 NextButton 连接

python - 对 3D 图形(圆柱体)进行纹理处理

python - 如何使用 Python 从另一个对象创建新的 JSON 对象?