使用2D数组广播1D数组

时间:2018-09-26 19:28:39

标签: python list numpy list-comprehension numpy-slicing

我有一个带有〜10 ** 8个元素的一维数组array_data

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

以下是array_dataarray_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_dataarray_index切片axis=1的最佳方法是什么,这样我就可以对切片后的数组执行另一个任务(例如{{ 1}},minmax)?

目前,我的解决方案使用列表推导并将其转换回numpy数组。这种方法似乎笨拙且缓慢:

mean

编辑:添加了最小,完整和可验证的示例(在python 2.7中有效)。

1 个答案:

答案 0 :(得分: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等)。