我有一个一维数组,其中的输入有一个模式。我举个例子。在数组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/