我有一个数组:
a = [1, 3, 5, 7, 29 ... 5030, 6000]
此数组是从前一个进程创建的,数组的长度可能不同(取决于用户输入)。
我也有一个数组:
b = [3, 15, 67, 78, 138]
(也可能完全不同)
我想使用数组b
将数组a
切分为多个数组。
更具体地说,我希望结果数组为:
array1 = a[:3]
array2 = a[3:15]
...
arrayn = a[138:]
n = len(b)
。
我的第一个想法是创建一个维度为slices
的二维数组(len(b), something)
。但是我们事先并不知道这个something
所以我为其分配了值len(a)
,因为这是它可以包含的最大数量。
我有这段代码:
slices = np.zeros((len(b), len(a)))
for i in range(1, len(b)):
slices[i] = a[b[i-1]:b[i]]
但是我收到了这个错误:
ValueError: could not broadcast input array from shape (518) into shape (2253412)
答案 0 :(得分:5)
您可以使用numpy.split:
np.split(a, b)
实施例:
np.split(np.arange(10), [3,5])
# [array([0, 1, 2]), array([3, 4]), array([5, 6, 7, 8, 9])]
答案 1 :(得分:2)
b.insert(0,0)
result = []
for i in range(1,len(b)):
sub_list = a[b[i-1]:b[i]]
result.append(sub_list)
result.append(a[b[-1]:])
答案 2 :(得分:2)
您收到错误是因为您正在尝试创建一个不规则的数组。 numpy中不允许这样做。
对@ Bohdan的回答有所改进:
from itertools import zip_longest
result = [a[start:end] for start, end in zip_longest(np.r_[0, b], b)]
这里的诀窍是zip_longest
使最终切片从b[-1]
变为None
,相当于a[b[-1]:]
,从而无需对最后一个进行特殊处理元件。
请不要选择此项。这只是我为了好玩添加的东西。 “正确”答案是@ Psidom的答案。