说明
假设我们有一个三维 Numpy 数组 A
,其形状为 (X, Y, Z)
。现在我们想要创建一个新数组 B
,也具有形状 (X, Y, Z)
。
我们希望 B
的前 n 个(:n
)零轴切片与每个 m 切片(::m
)的零轴切片对应于 A
。
我们还希望 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)])
n
是 3 吗?但是当它说print(B[4])
和print(B[5])
时,不应该是print(B[2])
和print(B[3])
吗? - jdehesa