2015-03-16 45 views
5

Thật dễ dàng để Resample một mảng nhưResample một mảng NumPy

a = numpy.array([1,2,3,4,5,6,7,8,9,10]) 

với một số nguyên resampling yếu tố. Ví dụ, với một yếu tố 2:

b = a[::2] # [1 3 5 7 9] 

Nhưng với một yếu tố phi nguyên resampling, nó không hoạt động quá dễ dàng:

c = a[::1.5] # [1 2 3 4 5 6 7 8 9 10] => not what is needed... 

Nó phải (với suy tuyến tính):

[1 2.5 4 5.5 7 8.5 10] 

hoặc (bằng cách lấy hàng xóm gần nhất trong mảng)

[1 3 4 6 7 9 10] 

Làm cách nào để lấy mẫu lại một mảng có khối u với hệ số lấy mẫu không nguyên?

+0

hành vi mong muốn là gì? Nội suy tuyến tính hoặc hàng xóm gần nhất trong mảng? – wflynny

+0

@wflynny Cả hai sẽ hoạt động ... Nếu gần nhất neighboor, có lẽ nó thậm chí không cần thiết để nhân đôi mảng trong bộ nhớ, chỉ là một "xem" mới của mảng có thể là có thể, phải không? (Cuối cùng tôi có thể sử dụng interp tuyến tính cho chất lượng tốt hơn) – Basj

+1

có thể phải sử dụng 'scipy.interpolate.interp1d' hoặc một trong các thói quen nội suy khác trong scipy – reptilicus

Trả lời

11

NumPy có numpy.interp mà không suy tuyến tính:

In [1]: numpy.interp(np.arange(0, len(a), 1.5), np.arange(0, len(a)), a) 
Out[1]: array([ 1. , 2.5, 4. , 5.5, 7. , 8.5, 10. ]) 

scipy có scipy.interpolate.interp1d mà có thể làm suy tuyến tính và gần nhất (mặc dù thời điểm đó là khu vực gần có thể không được rõ ràng):

In [2]: from scipy.interpolate import interp1d 
In [3]: xp = np.arange(0, len(a), 1.5) 
In [4]: lin = interp1d(np.arange(len(a)), a) 

In [5]: lin(xp) 
Out[5]: array([ 1. , 2.5, 4. , 5.5, 7. , 8.5, 10. ]) 

In [6]: nearest = interp1d(np.arange(len(a)), a, kind='nearest') 

In [7]: nearest(xp) 
Out[7]: array([ 1., 2., 4., 5., 7., 8., 10.]) 
4

Và nếu bạn lấy mẫu số nguyên

a = numpy.array([1,2,3,4,5,6,7,8,9,10]) 
factor = 1.5 
x = map(int,numpy.round(numpy.arange(0,len(a),factor))) 
sampled = a[x] 
+0

Rất tốt! Bạn có nghĩ rằng giải pháp khác có hiệu quả hơn về mặt tốc độ không? – Basj

+0

có thể không nhanh hơn giải pháp scipy/numpy. chỉ cho bạn tùy chọn. – EngineeredE

3

Vì bạn đề cập đến đây là dữ liệu từ tệp .WAV âm thanh, bạn có thể xem scipy.signal.resample.

Ví dụ mẫu x tới num mẫu bằng phương pháp Fourier dọc theo trục đã cho.

Tín hiệu được lấy mẫu lại bắt đầu ở cùng một giá trị như x nhưng được lấy mẫu với khoảng cách len(x)/num * (spacing of x). Vì sử dụng phương pháp Fourier , tín hiệu được giả định là định kỳ.

Mảng tuyến tính a không phải là tốt nhất để kiểm tra điều này vì nó không xuất hiện định kỳ. Nhưng xem xét sin dữ liệu:

x=np.arange(10) 
y=np.sin(x) 
y1, x1 =signal.resample(y,15,x) # 10 pts resampled at 15 

so sánh các với một trong hai

y1-np.sin(x1) # or 
plot(x, y, x1, y1)