【发布时间】:2019-02-15 17:53:20
【问题描述】:
声明
假设我们有一些 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)])
【问题讨论】:
-
所以在你的例子中
n是3?但是上面写着print(B[4])和print(B[5]),不应该是print(B[2])和print(B[3])吗? -
对不起,笨拙的编辑。你是对的。我会修改帖子
标签: python arrays python-3.x numpy