给定一个numpy数组' x'和一个跳跃大小的N'我必须创建一个函数,它将返回一个numpy.ndarray,其值为' x'例如,如果x = [0,1,2,3,4,5,6,7,8,9]且N = 2,则该函数将返回输出= [0,2,4] ,6,8]。到目前为止,我已经想到了以下内容:
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,所以我确信会有很多错误,所以非常感谢任何帮助!
答案 0 :(得分: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]
如果您坚持事先声明一个空数组并使用循环填充它,您可以稍微更改一下您的函数以执行以下操作之一。
您可以初始化一个空数组,并在每次循环迭代时将其扩展为另一个单元格。请注意,每次都会创建并返回一个新数组。
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])
答案 1 :(得分: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
答案 2 :(得分: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])