如何以不同的起点切成NP数组的特定尺寸?

时间:2019-05-31 08:39:25

标签: python numpy

示例代码如下。

我想根据dataNew(h, w, length)data(h, w, c)得到ind(h, w)。在length < c中,这意味着dataNew是从数据中切出的。

在此,请确保lengthind[i, j]适合c的值。

我已经通过for循环意识到了这一点,但是我采用python方式。请帮忙,谢谢!

import numpy as np

h, w, c = 3, 4, 5

data = np.arange(60).reshape((h, w, c))
print(data)

length = 3
ind = np.random.randint(0, 3, 12).reshape(h, w)
print(ind)

dataNew = np.empty((h, w, length), np.int16)
for i in range(h):
    for j in range(w):
        st = ind[i, j]
        dataNew[i, j] = data[i, j][st : st + length]

print(dataNew)

2 个答案:

答案 0 :(得分:1)

我们可以利用基于np.lib.stride_tricks.as_stridedscikit-image's view_as_windows来获取滑动窗口。 More info on use of as_strided based view_as_windows

function getQueryParameter(query, parameter) {
return (window.location.href.split(parameter + '=')[1].split('&')[0]);}

最后一步基本上是使用具有这些起始索引的高级索引到窗口中。这可以简化一些,并且可能更容易理解。所以,或者,我们可以做-

from skimage.util.shape import view_as_windows

# Get all sliding windows along the last axis
w = view_as_windows(data,(1,1,length))[...,0,0,:]

# Index into windows with start indices and slice out singleton dims 
out = np.take_along_axis(w,ind[...,None,None],axis=-1)[...,0]

答案 1 :(得分:1)

一种方法是使用broadcasting创建索引数组并使用np.take_along_axis对该数组建立​​索引:

ix = ind[...,None] + np.arange(length)
np.take_along_axis(data, ix, -1)