使用索引数组(Python)将numpy数组划分为多个数组

时间:2017-05-12 19:00:03

标签: python arrays numpy

我有一个数组:

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)

3 个答案:

答案 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的答案。