使用二维数组广播一维数组
Broadcast a 1D array using a 2D array
我有一个包含 ~10**8 个元素的一维数组 array_data
。
我有第二个数组 array_index
,它指定用于切片 array_data
的 绑定 ing 索引。
以下是 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))
问题: 沿着 axis=1
使用 array_index
切片 array_data
的最佳方法是什么,这样我就可以在切片上执行另一个任务数组(例如 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)。
当我 运行 你的代码时,我得到了一个不同大小的数组列表:
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 等)。
我有一个包含 ~10**8 个元素的一维数组 array_data
。
我有第二个数组 array_index
,它指定用于切片 array_data
的 绑定 ing 索引。
以下是 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))
问题: 沿着 axis=1
使用 array_index
切片 array_data
的最佳方法是什么,这样我就可以在切片上执行另一个任务数组(例如 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)。
当我 运行 你的代码时,我得到了一个不同大小的数组列表:
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 等)。