python - 如何通过切片范围有效地索引到一维 numpy 数组

标签 python arrays numpy slice

我有一个很大的一维数据数组。我有一个 starts 索引数组,指向发生重要事件的数据。我想获得一个范围数组,以便获得长度为 L 的窗口,每个窗口对应 starts 中的每个起点。伪造的样本数据:

data = np.linspace(0,10,50)
starts = np.array([0,10,21])
length = 5

我想本能地做类似的事情

data[starts:starts+length]

但实际上,我需要将 starts 转换为“windows”范围的二维数组。来自函数式语言,我会将其视为从列表到列表列表的 map,例如:

np.apply_along_axis(lambda i: np.arange(i,i+length), 0, starts)

但这行不通,因为 apply_along_axis 只允许标量返回值。

你可以这样做:

pairs = np.vstack([starts, starts + length]).T
ranges = np.apply_along_axis(lambda p: np.arange(*p), 1, pairs)
data[ranges]

或者您可以使用列表推导来完成:

data[np.array([np.arange(i,i+length) for i in starts])]

或者您可以迭代地进行。 (呸。)

是否有一种简洁、惯用的方法可以像这样在某些起点切入数组? (请原谅 NumPy 的新手。)

最佳答案

data = np.linspace(0,10,50)
starts = np.array([0,10,21])
length = 5

对于执行此操作的 NumPy 唯一方法,您可以按照此处所述使用 numpy.meshgrid()

http://docs.scipy.org/doc/numpy/reference/generated/numpy.meshgrid.html

正如 hpaulj 在评论中指出的那样,这个问题实际上不需要 meshgrid,因为您可以使用数组广播。

http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

# indices = sum(np.meshgrid(np.arange(length), starts))

indices = np.arange(length) + starts[:, np.newaxis]
# array([[ 0,  1,  2,  3,  4],
#        [10, 11, 12, 13, 14],
#        [21, 22, 23, 24, 25]])
data[indices]

返回

array([[ 0.        ,  0.20408163,  0.40816327,  0.6122449 ,  0.81632653],
       [ 2.04081633,  2.24489796,  2.44897959,  2.65306122,  2.85714286],
       [ 4.28571429,  4.48979592,  4.69387755,  4.89795918,  5.10204082]])

关于python - 如何通过切片范围有效地索引到一维 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29040449/

相关文章:

Python Matplotlib 箱线图颜色

android - Python、Kivy 和 Android 游戏

javascript - 通过javascript将base64字符串转换为字节数组

php - 从多维数组中获取结果,在 php 中没有重复结果

python - 将文本文件的列转换为科学记数法

python - 如何在 pytest 中的 mark.parametrize 中使用固定装置

python - 如何在Python中获取网站的跳数

javascript - 在 JavaScript/CoffeeScript 中确定一个数组是否包含另一个数组的内容

Python - 手册 - Windows 上使用 Spacy、Thinc 和 msgpack-numpy python 3.7 时库安装失败

python - Numpy - 两个 float 与浮点类型精度之间的差异