我有一个形状为(2, 9, 9)
的3D NumPy数组a
,如下所示:
a = np.array([
[[4, 5, 1, 3, 8, 8, 0, 6, 6],
[9, 2, 2, 1, 8, 2, 2, 4, 5],
[2, 3, 2, 2, 5, 3, 1, 2, 4],
[9, 6, 2, 9, 1, 0, 6, 2, 3],
[4, 2, 7, 7, 9, 1, 3, 7, 2],
[5, 8, 9, 4, 6, 3, 1, 6, 7],
[3, 6, 4, 7, 2, 9, 8, 3, 4],
[0, 4, 1, 2, 3, 7, 3, 7, 5],
[6, 9, 2, 6, 0, 0, 5, 1, 4]],
[[4, 2, 0, 1, 6, 7, 1, 0, 8],
[1, 5, 3, 6, 4, 2, 4, 8, 3],
[7, 4, 9, 9, 1, 9, 7, 3, 1],
[3, 6, 1, 2, 5, 4, 1, 3, 0],
[3, 3, 6, 6, 9, 8, 4, 2, 8],
[7, 9, 1, 3, 0, 2, 0, 7, 4],
[6, 7, 9, 3, 0, 2, 1, 9, 2],
[1, 0, 3, 4, 7, 8, 1, 6, 5],
[4, 4, 7, 8, 3, 7, 0, 4, 7]]])
我想使用沿后两个维度移动的窗口(在本例中为9 × 9
),获得形状为2 × 3 × 3
的三维块。第一个维度的大小(我称之为“深度”)是任意的。第一个区块的示例如下:
>>> array([
[[np.nan, np.nan, np.nan],
[np.nan, 4, 5],
[np.nan, 9, 2]],
[[np.nan, np.nan, np.nan],
[np.nan, 4, 2],
[np.nan, 1, 5]]])
第二个是:
>>> array([
[[np.nan, np.nan, np.nan],
[4, 5, 1],
[9, 2, 2]],
[[np.nan, np.nan, np.nan],
[4, 2, 0],
[1, 5, 3]]])
等等
稍后我需要对这些块应用一个更复杂的函数,而不是简单的平均值之类的,所以我希望使用一个新的数组(我想这是相当内存密集的,有没有其他方法?可能是矢量化的?但这不是必需的)
我尝试将np.lib.stride_tricks.as_strided
应用到我的案例中(如#44305987),并尝试使用#15722324中的花式索引,但没有达到预期的结果
谢谢
您可以使用^{} 进行此操作。由于您似乎希望这些窗口视图的最小大小为
2
个元素,因此可以将数组分配给一个更大的np.nan
数组,并获取结果数组的跨步视图:或者您也可以对^{} 执行相同的操作:
并认为:
相关问题 更多 >
编程相关推荐