python - 在大型一维 NumPy 数组中切片模式

标签 python numpy indexing slice

我有一个一维数组,其中的输入有一个模式。我举个例子。在数组arr中,我有 前 4 个输入为个位数,接下来的 4 个输入为两位数字,然后接下来的 6 个输入为 3 位数字。 (这个单位数、双位数、三位数只是为了突出显示模式。实际数组具有相似值的 float )。示例一维数组如下所示:

import numpy as np
arr = np.array([1, 2, 3, 4, 11, 12, 13, 14, 111, 123, 132, 145, 176, 129, 
                6, 5, 3, 2, 21, 82, 53, 34, 121, 133, 139, 165, 186, 119])

现在,一个完整的图案总共有 4+4+6 = 14 个条目。此模式(或重复单元)重复数十万次,因此我的数组的长度是 14 的倍数(在上面的示例 arr 中为 14 * 2 = 28)。

问题:

我想提取所有一位数字输入(一个重复单元的前4个数字),所有两位数字输入 (一个重复单元的接下来 4 个数字),以及所有三位数输入(一个重复单元的接下来 6 个数字)。

这样我希望将我的大arr分成三个一维数组。所以期望的输出

arr1 = array([1, 2, 3, 4, 6, 5, 3, 2])
arr2 = array([11, 12, 13, 14, 21, 82, 53, 34])
arr3 = array([111, 123, 132, 145, 176, 129, 121, 133, 139, 165, 186, 119])

我的想法

一种方法可能是简单地将其 reshape 为二维数组,因为我知道重复次数(示例中的=28/14 = 2 arr),然后使用索引以获取 4、4 和 6 的所有前 block 然后连接

arr = arr.reshape(2, 14)

然后使用切片来获取 block

arr1 = np.concatenate(arr[:, 0:4])
arr2 = np.concatenate(arr[:, 4:8])
arr3 = np.concatenate(arr[:, 8:])
print (arr1, arr2, arr3)

# array([1, 2, 3, 4, 6, 5, 3, 2]),
# array([11, 12, 13, 14, 21, 82, 53, 34]),
# array([111, 123, 132, 145, 176, 129, 121, 133, 139, 165, 186, 119]))

但我有兴趣了解一种替代且有效的解决方案,使用某种掩码切片而不首先转换为二维大批。

最佳答案

您还可以构建掩码:

# if you know where your indices are, otherwise use a formula
mask = np.zeros((3, 2, 14), dtype=bool)
mask[0,:, 0:4] = True
mask[1,:, 4:8] = True
mask[2,:, 8:] = True

arr1, arr2, arr3 = (arr[m.flatten()] for m in mask)
print (arr1, arr2, arr3)

关于python - 在大型一维 NumPy 数组中切片模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53872549/

相关文章:

python - 根据列中的值重复行

sql-server - 如何在我的搜索表列上创建临时非聚集索引并在选择操作后将其删除

python - 使用 Playwright 获取影子 DOM 元素后面的元素文本

python - 带有 numpy 的范围数组

python - 从 python 数组中获取高阶字节

mysql - SOLR 数据导入错误 "Unable to Execute Query"

mysql - 在未找到给定查询 "champion"的情况下,返回表中存在的 "championship"的最佳方法

python - 基于 IP 或主机名的 Django 设置

python - 对分类变量进行编码,例如 "State Names"

python - `s`中的 `%s`在字符串格式中是什么意思?