平均超过具有不同切片的 2d numpy 数组
Mean over 2d numpy array with varying slices
我需要计算每列切片不同的 2D numpy 数组的列的平均值。
比如我有一个数组
arr = np.arange(20).reshape(4, 5)
每个列的切片的结束索引均值定义为
bot_ix = np.array([3, 2, 2, 1, 2])
第一列的平均值将是
arr[0:bot_ix[0], 0].mean()
执行此操作的合适(即 Pythonic + 高效)方法是什么?我的数组大小是 ~(50, 50K).
您可以使用 NumPy broadcasting
-
mask = bot_ix > np.arange(arr.shape[0])[:,None]
out = np.true_divide(np.einsum('ij,ij->j',arr,mask),mask.sum(0))
样本运行验证结果-
In [431]: arr
Out[431]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
In [432]: bot_ix
Out[432]: array([3, 2, 2, 1, 2])
In [433]: np.true_divide(np.einsum('ij,ij->j',arr,mask),mask.sum(0))
Out[433]: array([ 5. , 3.5, 4.5, 3. , 6.5])
In [434]: [arr[0:item, i].mean() for i,item in enumerate(bot_ix)]
Out[434]: [5.0, 3.5, 4.5, 3.0, 6.5] # Loopy version to test out o/p
一种方法是让 numpy 计算累积和,然后在新生成的数组中使用花式索引,如下所示:
np.true_divide(arr.cumsum(axis=0)[bot_ix-1,range(arr.shape[1])], bot_ix)
我不会对速度做出任何假设,因为它不必要地计算比严格要求更多的元素的累计和,但这完全取决于您的特定数据。
Divakar 和 Oliver W. 的混合
mask = np.arange(arr.shape[0])[:, None] < bot_ix
(arr * mask).sum(0) / bot_ix.astype(float)
array([ 5. , 3.5, 4.5, 3. , 6.5])
我需要计算每列切片不同的 2D numpy 数组的列的平均值。
比如我有一个数组
arr = np.arange(20).reshape(4, 5)
每个列的切片的结束索引均值定义为
bot_ix = np.array([3, 2, 2, 1, 2])
第一列的平均值将是
arr[0:bot_ix[0], 0].mean()
执行此操作的合适(即 Pythonic + 高效)方法是什么?我的数组大小是 ~(50, 50K).
您可以使用 NumPy broadcasting
-
mask = bot_ix > np.arange(arr.shape[0])[:,None]
out = np.true_divide(np.einsum('ij,ij->j',arr,mask),mask.sum(0))
样本运行验证结果-
In [431]: arr
Out[431]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
In [432]: bot_ix
Out[432]: array([3, 2, 2, 1, 2])
In [433]: np.true_divide(np.einsum('ij,ij->j',arr,mask),mask.sum(0))
Out[433]: array([ 5. , 3.5, 4.5, 3. , 6.5])
In [434]: [arr[0:item, i].mean() for i,item in enumerate(bot_ix)]
Out[434]: [5.0, 3.5, 4.5, 3.0, 6.5] # Loopy version to test out o/p
一种方法是让 numpy 计算累积和,然后在新生成的数组中使用花式索引,如下所示:
np.true_divide(arr.cumsum(axis=0)[bot_ix-1,range(arr.shape[1])], bot_ix)
我不会对速度做出任何假设,因为它不必要地计算比严格要求更多的元素的累计和,但这完全取决于您的特定数据。
Divakar 和 Oliver W. 的混合
mask = np.arange(arr.shape[0])[:, None] < bot_ix
(arr * mask).sum(0) / bot_ix.astype(float)
array([ 5. , 3.5, 4.5, 3. , 6.5])