我有一个(n×I×j)-3D numpy数组:a_3d_array
(2×5×3)
array([[[1, 2, 3],
[1, 1, 1],
[2, 2, 2],
[0, 3, 3],
[0, 0, 4]],
[[1, 2, 3],
[2, 2, 2],
[3, 3, 3],
[0, 4, 4],
[0, 0, 5]]]).
对于n中的每个列j,我想提取最后2个非零元素并计算平均值,然后将结果放入(n×j)数组中。我现在做的是使用for循环
import numpy as np
a_3d_array = np.array([[[1, 2, 3],
[1, 1, 1],
[2, 2, 2],
[0, 3, 3],
[0, 0, 4]],
[[1, 2, 3],
[2, 2, 2],
[3, 3, 3],
[0, 4, 4],
[0, 0, 5]]])
aveCol = np.zeros([2,3])
for n in range(2):
for j in range(3):
temp = a_3d_array[n,:,j]
nonzero_array = temp[np.nonzero(temp)]
aveCol[n, j] = np.mean(nonzero_array[-2:])
为了得到想要的结果
print(aveCol)
[[1.5 2.5 3.5] [2.5 3.5 4.5]]
那很好。但我想知道是否有更好的Python式方法来做同样的事情
我发现与我的问题最相似的是here。但我不太理解在稍微不同的背景下解释的答案
TL;据我所知,Ann's answer是最快的
每个
m
是一个n×i2D数组,接下来我们取其转置的r
流,即执行计算的“列”——在这个“列”上,我们丢弃所有零,最后两个非零元素求和并取平均值Edit1
它看起来比你的循环快
Edit2
Edit3
Edit4突发新闻信息
安回答的罪魁祸首是
np.mean
您可以使用
filter
方法从数组中筛选出0
以下是一种列表理解方法:
输出:
@GBOFI注释:为了提高效率,请使用
而不是
您可以获取数组
a
的索引,用负数标记零项,排序,限制,然后将结果用作索引:相关问题 更多 >
编程相关推荐