声明
假设我们有一些3维的numpy数组A,其形状为(X,Y,Z).我想创建一个新的数组B,它也将具有形状(X,Y,Z).
我们希望沿着第零轴的B的前n个切片(:n)对应于沿着第零轴的A的第m个切片(:: m).
我们还希望B的切片n:2 * n对应于A的每m个第1个切片(1 :: m).对于数组的其余部分,依此类推.
使用矢量化的numpy计算实现此目标的最佳方法是什么?
例
通过一个示例可以最好地理解上述陈述.因此,让我们开始设置一些示例数组A:
import numpy as np
# Create array A with shape (15, 3, 3)
n = 3; m = 5
a = np.array([i * np.eye(3) for i in range(1, 1+m)])
A = np.tile(a, (n, 1, 1))
如果我们看一下A的第零个切片,我们会得到:
print(A[0])
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
print(A[1])
[[2. 0. 0.]
[0. 2. 0.]
[0. 0. 2.]]
…
print(A[4])
[[5. 0. 0.]
[0. 5. 0.]
[0. 0. 5.]]
print(A[5])
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
等等.
A中的值并不重要,但应有助于说明原始语句.
我想知道我们是否只能使用numpy函数创建矩阵B.数组B应该有切片:
print(B[0])
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
print(B[1])
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
print(B[2])
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
print(B[3])
[[2. 0. 0.]
[0. 2. 0.]
[0. 0. 2.]]
等等.
有什么方法可以用纯粹的numpy解决方案从A生成B?
我尝试过的
以下给出所需的B,但是随着m变大,它变得很乏味:
# vstack solution
B = np.vstack((A[::m], A[1::m], A[2::m], A[3::m], A[4::m]))
使用列表理解也可以,但是我想避免使用循环:
# List comprehension solution
B = np.vstack([A[i::m] for i in range(m)])