Python 2.7 numpy数组中连续元素的首次出现
我有一个二进制numpy掩码数组,我想在至少连续出现3次1时,找到沿轴=0的元素索引。如果没有出现-999或NaN或任何显示它不是索引的内容。 例如,我的数组如下所示:Python 2.7 numpy数组中连续元素的首次出现,python-2.7,pandas,numpy,Python 2.7,Pandas,Numpy,我有一个二进制numpy掩码数组,我想在至少连续出现3次1时,找到沿轴=0的元素索引。如果没有出现-999或NaN或任何显示它不是索引的内容。 例如,我的数组如下所示: masked_array( data=[[[1.0, 0.0], [0.0, 1.0]], [[0.0, 1.0], [0.0, 1.0]], [[1.0, 1.0], [1.0, 1.0]], [[1.0, 1.0], [1.0, 0.0]], [
masked_array(
data=[[[1.0, 0.0],
[0.0, 1.0]],
[[0.0, 1.0],
[0.0, 1.0]],
[[1.0, 1.0],
[1.0, 1.0]],
[[1.0, 1.0],
[1.0, 0.0]],
[[1.0, --],
[0.0, 1.0]],
[[1.0, 1.0],
[1.0, 1.0]]])
我想得到这样的东西:
array([[ 2, 1],
[-999, 0]])
做这件事最像蟒蛇的方式是什么?任何提示都将不胜感激。IIUC,您可以先将np阵列制作成2D,然后构建一个数据帧,这将使一切变得更简单。看一看
row, cols = m.shape[0], m.shape[1] * m.shape[2]
df = pd.DataFrame(m.reshape(row, cols))
0 1 2 3
0 1.0 0.0 0.0 1.0
1 0.0 1.0 0.0 1.0
2 1.0 1.0 1.0 1.0
3 1.0 1.0 1.0 0.0
4 1.0 0.0 0.0 1.0
5 1.0 1.0 1.0 1.0
现在,您可以在轴=0
上使用3
的反向滚动
窗口,并检查所有
元素是否1
ndf = df[::-1].rolling(3, axis=0).apply(all, raw=True)[::-1]
0 1 2 3
0 NaN NaN NaN 1.0
1 NaN 1.0 NaN NaN
2 1.0 NaN NaN NaN
3 1.0 NaN NaN NaN
4 NaN NaN NaN NaN
5 NaN NaN NaN NaN
并使用idxmax()
获取第一次1
出现的索引
ndf[ndf>=1].idxmax()
0 2.0
1 1.0
2 NaN
3 0.0
dtype: float
要可视化您描述的方式,只需重塑输出
ndf[ndf>=1].idxmax().values.reshape(m.shape[1], m.shape[2])
array([[ 2., 1.],
[nan, 0.]])
绝妙的解决方案!谢谢。虽然它解决了我的问题,但只是想知道它是否可以只用numpy而不是熊猫?