эффективный способ перестроить np.array на основе перемещающейся нарезки np.array [duplicate]

Вот способ, который вы можете использовать в своем коде для преобразования строки url и карты параметров в действительную кодированную строку url, содержащую параметры запроса.

String addQueryStringToUrlString(String url, final Map<Object, Object> parameters) throws UnsupportedEncodingException {
    if (parameters == null) {
        return url;
    }

    for (Map.Entry<Object, Object> parameter : parameters.entrySet()) {

        final String encodedKey = URLEncoder.encode(parameter.getKey().toString(), "UTF-8");
        final String encodedValue = URLEncoder.encode(parameter.getValue().toString(), "UTF-8");

        if (!url.contains("?")) {
            url += "?" + encodedKey + "=" + encodedValue;
        } else {
            url += "&" + encodedKey + "=" + encodedValue;
        }
    }

    return url;
}
13
задан Divakar 7 January 2017 в 13:21
поделиться

1 ответ

Подход №1: Использование broadcasting -

def broadcasting_app(a, L, S ):  # Window len = L, Stride len/stepsize = S
    nrows = ((a.size-L)//S)+1
    return a[S*np.arange(nrows)[:,None] + np.arange(L)]

Подход №2: Использование более эффективного NumPy strides -

def strided_app(a, L, S ):  # Window len = L, Stride len/stepsize = S
    nrows = ((a.size-L)//S)+1
    n = a.strides[0]
    return np.lib.stride_tricks.as_strided(a, shape=(nrows,L), strides=(S*n,n))

Пример прогона -

In [143]: a
Out[143]: array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

In [144]: broadcasting_app(a, L = 5, S = 3)
Out[144]: 
array([[ 1,  2,  3,  4,  5],
       [ 4,  5,  6,  7,  8],
       [ 7,  8,  9, 10, 11]])

In [145]: strided_app(a, L = 5, S = 3)
Out[145]: 
array([[ 1,  2,  3,  4,  5],
       [ 4,  5,  6,  7,  8],
       [ 7,  8,  9, 10, 11]])
23
ответ дан Divakar 18 August 2018 в 23:37
поделиться
  • 1
    Спасибо, я пробовал это: X = np.arange (100) Y = strided_app (X, 4, 1) Что дает Y как ожидалось, а теперь: Z = strided_app (Y, 8, 4) # Я хочу, чтобы Z отображал Y с движущимся окном длиной 8 и шагом 4, но это приводит к нежелательной. Вы можете исправить? – volatile 19 January 2017 в 16:28
  • 2
    @volatile Я не уверен, что вы ожидаете с помощью Z? Z = strided_app(X, 8, 4) даст желаемый Z? Ожидаете ли вы Z как 3D-массив? – Divakar 19 January 2017 в 17:42
  • 3
    Вы также получаете сумасшедший результат от strided_app(np.array([np.arange(6)]),3,1)? Я использую python 3.6 и numpy 1.13.1 в Anaconda. – Ziofil 12 September 2017 в 05:11
  • 4
    @Ziofil strided_app принимает 1D-массив. np.array([np.arange(6)]) - это 2D-массив. Не знаете, зачем вам нужно обернуть его с помощью np.array(), поскольку np.arange(6) уже является массивом. Что именно вы пытаетесь сделать с np.array()? – Divakar 12 September 2017 в 05:14
  • 5
    Ранее я использовал as_strided, но обнаружил, что это вызвало очень серьезную утечку памяти. Это не проблема для небольших массивов, но даже с использованием 64 ГБ ОЗУ на сервере, мои программы на python повысили память MemoryError. Очень рекомендую использовать метод broadcasting_app. – pacificgilly1992 9 December 2017 в 09:27
Другие вопросы по тегам:

Похожие вопросы: