2014-10-07 2 views
-1

Учитывая массив numpy 'x' и размер шага 'N', мне нужно создать функцию, которая вернет numpy.ndarray со значениями 'x', которые соответствуют ходу размер, например, если x = [0,1,2,3,4,5,6,7,8,9] и N = 2, функция вернет выход = [0,2,4,6,8 ]. До сих пор я думал о следующем:Объявите пустой numpy.ndarray и залейте его

def hopSamples(x,N) 
    i = 0 
    n = len(x) 
    output = numpy.ndarray([]) 
    while i<n: 
     output.append(x[i]) 
     i = i+N 
    return output 

но он дает ошибки. Как я могу это сделать? Я только начинаю python, поэтому я уверен, что будет много ошибок, поэтому любая помощь будет очень оценена!

+2

проводков точных ошибок вы получаете были бы полезны в будущем, хотя ответы, которые вы получили, превосходны. – porglezomp

+2

Кроме того, ваше название вопроса не соответствует вашему описанию вопроса. Способ «объявить (фактически, создать) пустой массив и заполнить его» - это «np.zeros» плюс нормальная установка индекса. Но то, что вы хотите сделать, в первую очередь не требует. – abarnert

+0

Да, извините, я вижу это сейчас. Прошу прощения за недостаток знаний в Python, я начал использовать его только на прошлой неделе. Спасибо за ваши комментарии! – Hec46

ответ

3

Вы можете использовать нарезку:

In [14]: arr = np.arange(0, 10) 

In [15]: arr 
Out[15]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 

In [16]: arr[::2] 
Out[16]: array([0, 2, 4, 6, 8]) 

Таким образом, ваша функция будет просто выглядеть следующим образом:

def hopSamples1(x, N): 
    return x[::N] 

Если вы настойчивы t объявить пустой массив заранее и заполнить его с помощью цикла, вы можете немного изменить свою функцию, чтобы выполнить одно из следующих действий.

  • Вы можете инициализировать пустой массив и продлить его другой ячейкой с каждой итерацией цикла. Обратите внимание, что новый массив создается и возвращается каждый раз.

    def hopSamples2(x, N): 
        i = 0 
        n = len(x) 
        output = np.empty(shape = 0, dtype = x.dtype) 
        while i < n: 
         output = np.append(output, x[i]) 
         i += N 
        return output 
    
  • Альтернативная реализация будет создавать весь массив заранее, но установка значения в своих клетках один за другим.

    def hopSamples3(x, N): 
        i = 0 
        n = len(x) 
        m = n/N 
        output = np.ndarray(shape = m, dtype = x.dtype) 
        while i < m: 
         output[i] = x[i * N] 
         i += 1 
        return output 
    

Простого тест тест показывает, что использование нарезки самый быстрый подход при расширении массива один за другим является самым медленным:

In [146]: %time hopSamples1(arr, 2) 
CPU times: user 21 µs, sys: 3 µs, total: 24 µs 
Wall time: 28.8 µs 
Out[146]: array([0, 2, 4, 6, 8]) 

In [147]: %time hopSamples2(arr, 2) 
CPU times: user 241 µs, sys: 29 µs, total: 270 µs 
Wall time: 230 µs 
Out[147]: array([0, 2, 4, 6, 8]) 

In [148]: %time hopSamples3(arr, 2) 
CPU times: user 35 µs, sys: 5 µs, total: 40 µs 
Wall time: 45.8 µs 
Out[148]: array([0, 2, 4, 6, 8]) 
+0

Большое спасибо за ваши усилия! На самом деле я мог сделать это в любом случае, но мои предыдущие знания о Matlab заставляли меня думать, что тот, который я объяснил, был хорошим способом сделать это, но тогда вы, ребята, показали мне самый простой способ, который я не знал, и это как я это сделал. Итак, большое спасибо! – Hec46

1

использование NumPy нарезка, в основном, start:stop:step:

In [20]: xs 
Out[20]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 

In [21]: xs[::2] 
Out[21]: array([0, 2, 4, 6, 8]) 
+0

Спасибо! Работает отлично! – Hec46

2
import numpy as np 
a = np.array([0,1,2,3,4,5,6,7,8,9,10]) 
print "Please input a step number: " 
N = int(raw_input()) 
b = a[::N] 
print "b is: ", b 
+0

Хороший способ сделать это, спасибо! – Hec46

Смежные вопросы