0

我有一个array_data包含 ~10**8 个元素的一维数组。

我有第二个数组array_index,它指定用于切片的边界array_data索引。

以下是 and 的最小、完整和可验证的array_data示例array_index

import numpy as np

#Create data
array_data = np.arange(100)

#Randomly create indices
array_index = np.sort(np.random.randint(100, size=(10,2)))

#For each randomly created index, slice the array
array_sliced = [array_data[index[0]:index[1]]) for index in array_index]

#Now data is sliced, perform operation on the sliced data. For example:
val = []
for slice in array_sliced:
    val.append(np.nanmean(slice))

问题:最好的切片方式是什么array_data,以便我可以在切片数组array_indexaxis=1执行另一项任务(例如min, max, mean)?

我目前的解决方案使用列表理解和转换回 numpy 数组。这种方法看起来笨重且缓慢:

>>> np.array([np.nanmean(array_data[index[0]:index[1]]) for index in array_index], dtype=np.float64)

编辑:添加了最小、完整和可验证的示例(适用于 python 2.7)。

4

1 回答 1

1

当我运行你的代码时,我得到一个不同大小的数组列表:

In [63]: [len(x) for x in array_sliced]
Out[63]: [3, 46, 38, 9, 73, 66, 3, 23, 40, 36]

(你也得到这个np.diff(array_index,axis=1)

一般的观察是,在处理不同大小的数组时,很难以任何二维方式处理它们。

您可能能够生成一个 (10,100) 掩码,对于要保留在每一行中的值,为 True,为省略为 False。或者也许np.nan是为了省略。

或者考虑填充这 10 个数组,使它们适合 (10,73) 数组,再次使用适当的填充元素(0、nan 等)。

于 2018-09-27T03:12:38.183 回答