python - Python - 通过每 n 行取 n 个连续行来重塑矩阵
问题描述
在 stackoverflow 上有很多关于使用 NumPy 重塑矩阵的问题。我找到了一个与我想要实现的目标密切相关的东西。但是,这个答案对于我的应用程序来说不够通用。所以我们在这里。
我有一个包含数百万行(形状m x n
)的矩阵,如下所示:
[[0, 0, 0, 0],
[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3],
[4, 4, 4, 4],
[5, 5, 5, 5],
[6, 6, 6, 6],
[7, 7, 7, 7],
[...]]
从这个我想去一个m/2 x 2n
像下面可以看到的形状。为此,必须每 n 行取 n 个连续行(在本例中 n = 2)。然后将连续取行的块水平堆叠到未触及的行。在这个例子中,这意味着:
- 前两行保持原样。
- 取第 2 行和第 3 行并将它们水平连接到第 0 行和第 1 行。
- 取第 6 行和第 7 行,并将它们水平连接到第 4 行和第 5 行。这个连接的块然后变成第二行和第三行。
- ...
[[0, 0, 0, 0, 2, 2, 2, 2],
[1, 1, 1, 1, 3, 3, 3, 3],
[4, 4, 4, 4, 6, 6, 6, 6],
[5, 5, 5, 5, 7, 7, 7, 7],
[...]]
我将如何最有效地(就可能的最少计算时间而言)使用 Numpy 做到这一点?使用 Numba 加快进程是否有意义?还是没有太多可以加快的速度?
解决方案
假设您的数组的长度可被 4 整除,这里您可以使用numpy.hstack创建正确的索引以选择结果数组的“左”和“右”部分的行:
import numpy
# Create the array
N = 1000*4
a = np.hstack([np.arange(0, N)[:, None]]*4) #shape (4000, 4)
a
array([[ 0, 0, 0, 0],
[ 1, 1, 1, 1],
[ 2, 2, 2, 2],
...,
[3997, 3997, 3997, 3997],
[3998, 3998, 3998, 3998],
[3999, 3999, 3999, 3999]])
left_idx = np.array([np.array([0,1]) + 4*i for i in range(N//4)]).reshape(-1)
right_idx = np.array([np.array([2,3]) + 4*i for i in range(N//4)]).reshape(-1)
r = np.hstack([a[left_idx], a[right_idx]]) #shape (2000, 8)
r
array([[ 0, 0, 0, ..., 2, 2, 2],
[ 1, 1, 1, ..., 3, 3, 3],
[ 4, 4, 4, ..., 6, 6, 6],
...,
[3993, 3993, 3993, ..., 3995, 3995, 3995],
[3996, 3996, 3996, ..., 3998, 3998, 3998],
[3997, 3997, 3997, ..., 3999, 3999, 3999]])
推荐阅读
- python - 张量流2;如何使用预定义的稀疏权重架构创建自定义层/渐变?
- python - Lambda Python - 打印格式改进
- javascript - 代码在函数内部时不起作用
- python - 如何在 Python PyQt5 QTableView 中对齐(中心)行数据?
- java - 我想知道为什么我的“登录逻辑”总是错误的条件?
- numpy - 如何有效地计算 numpy 中的回转张量?
- c# - 使用 Xaml 设置默认值或组合框(尽管有绑定)
- c - 如何使用 strtok?
- vue.js - Bootstrap Vue datepicker 道具最大值失败,预期字符串,日期,得到日期
- java - 将 WriteableImage 转换为 BufferedImage