116
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Câu hỏi này chứa câu trả lời của riêng nó ở phía dưới. Sử dụng các mảng preallrocated.
Theo sau câu hỏi này nhiều năm trước, có chức năng "thay đổi" kinh điển trong Numpy không? Tôi không thấy bất cứ điều gì từ tài liệu.
Đây là một phiên bản đơn giản của những gì tôi đang tìm kiếm:
def shift[xs, n]:
if n >= 0:
return np.r_[np.full[n, np.nan], xs[:-n]]
else:
return np.r_[xs[-n:], np.full[-n, np.nan]]
Sử dụng điều này giống như:
In [76]: xs
Out[76]: array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]]
In [77]: shift[xs, 3]
Out[77]: array[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
In [78]: shift[xs, -3]
Out[78]: array[[ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan]]
Câu hỏi này xuất phát từ nỗ lực của tôi để viết một sản phẩm nhanh chóng ngày hôm qua. Tôi cần một cách để "thay đổi" một sản phẩm tích lũy và tất cả những gì tôi có thể nghĩ là sao chép logic trong
def shift[xs, n]:
e = np.empty_like[xs]
if n >= 0:
e[:n] = np.nan
e[n:] = xs[:-n]
else:
e[n:] = np.nan
e[:n] = xs[-n:]
return e
1.Vì vậy,
def shift[xs, n]:
e = np.empty_like[xs]
if n >= 0:
e[:n] = np.nan
e[n:] = xs[:-n]
else:
e[n:] = np.nan
e[:n] = xs[-n:]
return e
2 nhanh hơn nhiều so với def shift[xs, n]:
e = np.empty_like[xs]
if n >= 0:
e[:n] = np.nan
e[n:] = xs[:-n]
else:
e[n:] = np.nan
e[:n] = xs[-n:]
return e
3. Phiên bản này của chức năng hoạt động tốt hơn rất nhiều:def shift[xs, n]:
if n >= 0:
return np.concatenate[[np.full[n, np.nan], xs[:-n]]]
else:
return np.concatenate[[xs[-n:], np.full[-n, np.nan]]]
Một phiên bản thậm chí nhanh hơn chỉ đơn giản là trước khi phân bổ mảng:
def shift[xs, n]:
e = np.empty_like[xs]
if n >= 0:
e[:n] = np.nan
e[n:] = xs[:-n]
else:
e[n:] = np.nan
e[:n] = xs[-n:]
return e
Đề xuất trên là câu trả lời. Sử dụng các mảng preallrocated.
Khi được hỏi ngày 22 tháng 5 năm 2015 lúc 14:36May 22, 2015 at 14:36
ChrisayCockchrisaycockchrisaycock
35.3K14 Huy hiệu vàng88 Huy hiệu bạc121 Huy hiệu đồng14 gold badges88 silver badges121 bronze badges
4
Không phải là Numpy nhưng Scipy cung cấp chính xác chức năng thay đổi mà bạn muốn,
import numpy as np
from scipy.ndimage.interpolation import shift
xs = np.array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]]
shift[xs, 3, cval=np.NaN]
trong đó mặc định là mang lại một giá trị không đổi từ bên ngoài mảng có giá trị
def shift[xs, n]:
e = np.empty_like[xs]
if n >= 0:
e[:n] = np.nan
e[n:] = xs[:-n]
else:
e[n:] = np.nan
e[:n] = xs[-n:]
return e
4, được đặt ở đây thành def shift[xs, n]:
e = np.empty_like[xs]
if n >= 0:
e[:n] = np.nan
e[n:] = xs[:-n]
else:
e[n:] = np.nan
e[:n] = xs[-n:]
return e
5. Điều này cung cấp cho đầu ra mong muốn,array[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
và sự thay đổi tiêu cực hoạt động tương tự,
shift[xs, -3, cval=np.NaN]
Cung cấp đầu ra
array[[ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan]]
Đã trả lời ngày 29 tháng 5 năm 2015 lúc 16:22May 29, 2015 at 16:22
Ed Smithed SmithEd Smith
12.1k2 Huy hiệu vàng42 Huy hiệu bạc53 Huy hiệu đồng2 gold badges42 silver badges53 bronze badges
4
Đối với những người muốn chỉ sao chép và dán sự triển khai nhanh nhất của Shift, có một điểm chuẩn và kết luận [xem phần cuối]. Ngoài ra, tôi giới thiệu tham số fill_value và sửa một số lỗi.
Điểm chuẩn
import numpy as np
import timeit
# enhanced from IronManMark20 version
def shift1[arr, num, fill_value=np.nan]:
arr = np.roll[arr,num]
if num < 0:
arr[num:] = fill_value
elif num > 0:
arr[:num] = fill_value
return arr
# use np.roll and np.put by IronManMark20
def shift2[arr,num]:
arr=np.roll[arr,num]
if num 0:
np.put[arr,range[num],np.nan]
return arr
# use np.pad and slice by me.
def shift3[arr, num, fill_value=np.nan]:
l = len[arr]
if num < 0:
arr = np.pad[arr, [0, abs[num]], mode='constant', constant_values=[fill_value,]][:-num]
elif num > 0:
arr = np.pad[arr, [num, 0], mode='constant', constant_values=[fill_value,]][:-num]
return arr
# use np.concatenate and np.full by chrisaycock
def shift4[arr, num, fill_value=np.nan]:
if num >= 0:
return np.concatenate[[np.full[num, fill_value], arr[:-num]]]
else:
return np.concatenate[[arr[-num:], np.full[-num, fill_value]]]
# preallocate empty array and assign slice by chrisaycock
def shift5[arr, num, fill_value=np.nan]:
result = np.empty_like[arr]
if num > 0:
result[:num] = fill_value
result[num:] = arr[:-num]
elif num < 0:
result[num:] = fill_value
result[:num] = arr[-num:]
else:
result[:] = arr
return result
arr = np.arange[2000].astype[float]
def benchmark_shift1[]:
shift1[arr, 3]
def benchmark_shift2[]:
shift2[arr, 3]
def benchmark_shift3[]:
shift3[arr, 3]
def benchmark_shift4[]:
shift4[arr, 3]
def benchmark_shift5[]:
shift5[arr, 3]
benchmark_set = ['benchmark_shift1', 'benchmark_shift2', 'benchmark_shift3', 'benchmark_shift4', 'benchmark_shift5']
for x in benchmark_set:
number = 10000
t = timeit.timeit['%s[]' % x, 'from __main__ import %s' % x, number=number]
print '%s time: %f' % [x, t]
Kết quả điểm chuẩn:
benchmark_shift1 time: 0.265238
benchmark_shift2 time: 0.285175
benchmark_shift3 time: 0.473890
benchmark_shift4 time: 0.099049
benchmark_shift5 time: 0.052836
Sự kết luận
Shift5 là người chiến thắng! Đó là giải pháp thứ ba của OP.
Đã trả lời ngày 7 tháng 3 năm 2017 lúc 7:12Mar 7, 2017 at 7:12
GZCGZCgzc
7.6408 Huy hiệu vàng38 Huy hiệu bạc60 Huy hiệu đồng8 gold badges38 silver badges60 bronze badges
7
Điểm chuẩn và giới thiệu Numba
1. Tóm tắt
- Câu trả lời được chấp nhận [
6] là giải pháp chậm nhất được liệt kê trong trang này.def shift[xs, n]: e = np.empty_like[xs] if n >= 0: e[:n] = np.nan e[n:] = xs[:-n] else: e[n:] = np.nan e[:n] = xs[-n:] return e
- Numba [@numba.njit] cho một số hiệu suất tăng khi kích thước mảng nhỏ hơn ~ 25.000
- "Bất kỳ phương pháp nào" đều tốt như nhau khi kích thước mảng lớn [> 250.000].
- Tùy chọn nhanh nhất thực sự phụ thuộc vào & nbsp; & nbsp; & nbsp; & nbsp; [1] & nbsp; & nbsp; độ dài của mảng của bạn & nbsp; & nbsp; & nbsp;
[1] Length of your arrays
[2] Amount of shift you need to do. - Dưới đây là hình ảnh thời gian của tất cả các phương thức khác nhau được liệt kê trên trang này [2020-07-11], sử dụng không đổi Shift = 10. Như người ta có thể thấy, với kích thước mảng nhỏ, một số phương pháp được sử dụng nhiều hơn +2000% so với Phương pháp tốt nhất.
2. Điểm chuẩn chi tiết với các tùy chọn tốt nhất
- Chọn
7 [được xác định bên dưới] nếu bạn muốn tốt tất cảdef shift[xs, n]: e = np.empty_like[xs] if n >= 0: e[:n] = np.nan e[n:] = xs[:-n] else: e[n:] = np.nan e[:n] = xs[-n:] return e
3. Mã
3.1 def shift[xs, n]:
e = np.empty_like[xs]
if n >= 0:
e[:n] = np.nan
e[n:] = xs[:-n]
else:
e[n:] = np.nan
e[:n] = xs[-n:]
return e
7
def shift[xs, n]:
e = np.empty_like[xs]
if n >= 0:
e[:n] = np.nan
e[n:] = xs[:-n]
else:
e[n:] = np.nan
e[:n] = xs[-n:]
return e
- Tốt tất cả-arounder; Tối đa 20% WRT. theo phương pháp tốt nhất với bất kỳ kích thước mảng nào
- Phương pháp tốt nhất với kích thước mảng trung bình: ~ 500 = 0:
e[:n] = np.nan
e[n:] = xs[:-n]
else:
e[n:] = np.nan
e[:n] = xs[-n:]
return e
9
- Lựa chọn tốt nhất với nhỏ [n
- Hiệu suất tốt trên bất kỳ kích thước mảng nào; Tối đa + 50% so với giải pháp nhanh nhất.
3.3.
0import numpy as np from scipy.ndimage.interpolation import shift xs = np.array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]] shift[xs, 3, cval=np.NaN]
Phương pháp tốt nhất với kích thước mảng ~ 20.000 = 0: e[:n] = np.nan e[n:] = xs[:-n] else: e[n:] = np.nan e[:n] = xs[-n:] return e 6 [SCIPY 1.4.1] - Tùy chọn từ câu trả lời được chấp nhận, rõ ràng là sự thay thế chậm nhất.
4:import numpy as np from scipy.ndimage.interpolation import shift xs = np.array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]] shift[xs, 3, cval=np.NaN]
5 vàimport numpy as np from scipy.ndimage.interpolation import shift xs = np.array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]] shift[xs, 3, cval=np.NaN]
6 của IronManmark20 & GZCimport numpy as np from scipy.ndimage.interpolation import shift xs = np.array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]] shift[xs, 3, cval=np.NaN]
7:import numpy as np from scipy.ndimage.interpolation import shift xs = np.array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]] shift[xs, 3, cval=np.NaN]
5 vàimport numpy as np from scipy.ndimage.interpolation import shift xs = np.array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]] shift[xs, 3, cval=np.NaN]
9 của IronManmark20import numpy as np from scipy.ndimage.interpolation import shift xs = np.array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]] shift[xs, 3, cval=np.NaN]
0:array[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
1 vàarray[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
2 của GZCarray[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
array[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
3: array[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
4 và array[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
5 của Chrisaycockimport numpy as np
from scipy.ndimage.interpolation import shift
xs = np.array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]]
shift[xs, 3, cval=np.NaN]
0: Sử dụng hai lần array[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
7 bởi ChrisayCock
import numpy as np
from scipy.ndimage.interpolation import shift
xs = np.array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]]
shift[xs, 3, cval=np.NaN]
array[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
array[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
8: @numba.njit Phiên bản trang trí trước đó.
array[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
7 vàimport numpy as np from scipy.ndimage.interpolation import shift xs = np.array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]] shift[xs, 3, cval=np.NaN]
0 chứa các chức năng không được hỗ trợ bởi Numba hiện tại [0,50.1].array[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
- 4.2 Kết quả kiểm tra khác
4.2.1 Thời gian tương đối, tất cả các phương pháp
- Thời gian tương đối, thay đổi 10%, tất cả các phương pháp
- Thời gian tương đối, dịch chuyển không đổi [10], tất cả các phương pháp
4.2.2 Thời gian thô, tất cả các phương pháp
- Thời gian thô, dịch chuyển không đổi [10], tất cả các phương pháp
- Thời gian thô, thay đổi 10%, tất cả các phương pháp
- 4.2.3 Thời gian thô, một vài phương pháp tốt nhất
- Thời gian thô với các mảng nhỏ, dịch chuyển không đổi [10], một vài phương pháp tốt nhất
Đã trả lời ngày 10 tháng 7 năm 2020 lúc 20:07Jul 10, 2020 at 20:07
np8np8np8
23.3K10 Huy hiệu vàng80 Huy hiệu bạc90 Huy hiệu Đồng10 gold badges80 silver badges90 bronze badges
Không có chức năng nào làm những gì bạn muốn. Định nghĩa của bạn về sự thay đổi hơi khác so với những gì hầu hết mọi người đang làm. Các cách để thay đổi một mảng thường được lặp lại:
In [76]: xs
Out[76]: array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]]
In [77]: shift[xs, 3]
Out[77]: array[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
In [78]: shift[xs, -3]
Out[78]: array[[ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan]]
2Tuy nhiên, bạn có thể làm những gì bạn muốn với hai chức năng. Xem xét
shift[xs, -3, cval=np.NaN]
1:Consider
shift[xs, -3, cval=np.NaN]
1:In [76]: xs
Out[76]: array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]]
In [77]: shift[xs, 3]
Out[77]: array[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
In [78]: shift[xs, -3]
Out[78]: array[[ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan]]
3Sau khi chạy CPROFILE trên chức năng đã cho của bạn và mã trên bạn cung cấp, tôi thấy rằng mã bạn đã cung cấp thực hiện 42 cuộc gọi chức năng trong khi
import numpy as np
from scipy.ndimage.interpolation import shift
xs = np.array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]]
shift[xs, 3, cval=np.NaN]
7 thực hiện 14 cuộc gọi khi ARR dương và 16 khi nó âm. Tôi sẽ thử nghiệm thời gian để xem cách mỗi lần thực hiện với dữ liệu thực.Đã trả lời ngày 22 tháng 5 năm 2015 lúc 16:29May 22, 2015 at 16:29
2
Bạn có thể chuyển đổi
shift[xs, -3, cval=np.NaN]
3 thành shift[xs, -3, cval=np.NaN]
4 hoặc shift[xs, -3, cval=np.NaN]
5 với shift[xs, -3, cval=np.NaN]
6 trước, sau đó bạn có thể sử dụng phương thức shift[xs, -3, cval=np.NaN]
7 như bạn muốn.Example:
In [76]: xs
Out[76]: array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]]
In [77]: shift[xs, 3]
Out[77]: array[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
In [78]: shift[xs, -3]
Out[78]: array[[ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan]]
4Đã trả lời ngày 4 tháng 1 năm 2018 lúc 13:52Jan 4, 2018 at 13:52
Max Xumax XuMax Xu
1.98314 Huy hiệu bạc12 Huy hiệu đồng14 silver badges12 bronze badges
0
Bạn cũng có thể làm điều này với gấu trúc:
Sử dụng một mảng dài 2356:
In [76]: xs
Out[76]: array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]]
In [77]: shift[xs, 3]
Out[77]: array[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
In [78]: shift[xs, -3]
Out[78]: array[[ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan]]
5Sử dụng Scipy:
In [76]: xs
Out[76]: array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]]
In [77]: shift[xs, 3]
Out[77]: array[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
In [78]: shift[xs, -3]
Out[78]: array[[ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan]]
6Sử dụng gấu trúc:
In [76]: xs
Out[76]: array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]]
In [77]: shift[xs, 3]
Out[77]: array[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
In [78]: shift[xs, -3]
Out[78]: array[[ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan]]
7Trong ví dụ này, sử dụng gấu trúc nhanh hơn khoảng 8 lần so với scipy
Đã trả lời ngày 25 tháng 6 năm 2019 lúc 14:20Jun 25, 2019 at 14:20
Ran Aroussiran AroussiRan Aroussi
5311 huy hiệu vàng6 Huy hiệu bạc1 gold badge6 silver badges11 bronze badges
1
Nếu bạn muốn một lớp phủ từ Numpy và không quá quan tâm đến hiệu suất, hãy thử:
In [76]: xs
Out[76]: array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]]
In [77]: shift[xs, 3]
Out[77]: array[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
In [78]: shift[xs, -3]
Out[78]: array[[ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan]]
8Giải thích:
shift[xs, -3, cval=np.NaN]
8 Tạo một ma trận với mảng của bạn một lần chéo, shift[xs, -3, cval=np.NaN]
9 tổng hợp cột ma trận khôn ngoan và array[[ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan]]
0 lấy các phần tử tương ứng với kích thước của mảng ban đầu. Chơi xung quanh với array[[ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan]]
1 và array[[ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan]]
2 vì các tham số có thể cung cấp cho bạn sự thay đổi theo các hướng khác nhau.Đã trả lời ngày 20 tháng 10 năm 2019 lúc 9:49Oct 20, 2019 at 9:49
Một cách đơn giản và hiệu quả hỗ trợ các giá trị thay đổi tê liệt và tiêu cực như thư viện gấu trúc. Nó ngăn chặn việc tạo ra mảng gốc trong các đối số và cũng hoạt động với một mảng số nguyên:numba and negative shift values like Pandas library. It prevents corrupting the original array in arguments, and also works with an integer array:
In [76]: xs
Out[76]: array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]]
In [77]: shift[xs, 3]
Out[77]: array[[ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]]
In [78]: shift[xs, -3]
Out[78]: array[[ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan]]
9Example::
def shift[xs, n]:
if n >= 0:
return np.concatenate[[np.full[n, np.nan], xs[:-n]]]
else:
return np.concatenate[[xs[-n:], np.full[-n, np.nan]]]
0Timeit::
def shift[xs, n]:
if n >= 0:
return np.concatenate[[np.full[n, np.nan], xs[:-n]]]
else:
return np.concatenate[[xs[-n:], np.full[-n, np.nan]]]
1Lưu ý: Nếu bạn không cần tê, chỉ với Numpy, sau đó xóa dòng
3 và nhập tê.: if you dont need numba, just with numpy, then delete the line array[[ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan]]
array[[ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan]]
3 and the numba import.Đã trả lời ngày 5 tháng 3 lúc 15:47Mar 5 at 15:47
Nand0sanNand0sanNand0san
4153 Huy hiệu bạc11 Huy hiệu đồng3 silver badges11 bronze badges
0
Có lẽ
import numpy as np
from scipy.ndimage.interpolation import shift
xs = np.array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]]
shift[xs, 3, cval=np.NaN]
5 là những gì bạn cầndef shift[xs, n]:
if n >= 0:
return np.concatenate[[np.full[n, np.nan], xs[:-n]]]
else:
return np.concatenate[[xs[-n:], np.full[-n, np.nan]]]
2Đã trả lời ngày 21 tháng 4 năm 2021 lúc 5:54Apr 21, 2021 at 5:54
Fitz_HooFitz_HooFitz_Hoo
5415 Huy hiệu bạc4 Huy hiệu đồng5 silver badges4 bronze badges
1
Giải pháp của tôi liên quan đến
import numpy as np
from scipy.ndimage.interpolation import shift
xs = np.array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]]
shift[xs, 3, cval=np.NaN]
5 và các mảng đeo mặt nạ:def shift[xs, n]:
if n >= 0:
return np.concatenate[[np.full[n, np.nan], xs[:-n]]]
else:
return np.concatenate[[xs[-n:], np.full[-n, np.nan]]]
3Về cơ bản, tôi chỉ sử dụng
import numpy as np
from scipy.ndimage.interpolation import shift
xs = np.array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]]
shift[xs, 3, cval=np.NaN]
5 để thay đổi mảng, sau đó sử dụng array[[ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan]]
7 để đánh dấu các phần tử không mong muốn là không hợp lệ và điền vào các vị trí không hợp lệ đó bằng array[[ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan]]
8. Tôi đặt array[[ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan]]
9 thành import numpy as np
import timeit
# enhanced from IronManMark20 version
def shift1[arr, num, fill_value=np.nan]:
arr = np.roll[arr,num]
if num < 0:
arr[num:] = fill_value
elif num > 0:
arr[:num] = fill_value
return arr
# use np.roll and np.put by IronManMark20
def shift2[arr,num]:
arr=np.roll[arr,num]
if num 0:
np.put[arr,range[num],np.nan]
return arr
# use np.pad and slice by me.
def shift3[arr, num, fill_value=np.nan]:
l = len[arr]
if num < 0:
arr = np.pad[arr, [0, abs[num]], mode='constant', constant_values=[fill_value,]][:-num]
elif num > 0:
arr = np.pad[arr, [num, 0], mode='constant', constant_values=[fill_value,]][:-num]
return arr
# use np.concatenate and np.full by chrisaycock
def shift4[arr, num, fill_value=np.nan]:
if num >= 0:
return np.concatenate[[np.full[num, fill_value], arr[:-num]]]
else:
return np.concatenate[[arr[-num:], np.full[-num, fill_value]]]
# preallocate empty array and assign slice by chrisaycock
def shift5[arr, num, fill_value=np.nan]:
result = np.empty_like[arr]
if num > 0:
result[:num] = fill_value
result[num:] = arr[:-num]
elif num < 0:
result[num:] = fill_value
result[:num] = arr[-num:]
else:
result[:] = arr
return result
arr = np.arange[2000].astype[float]
def benchmark_shift1[]:
shift1[arr, 3]
def benchmark_shift2[]:
shift2[arr, 3]
def benchmark_shift3[]:
shift3[arr, 3]
def benchmark_shift4[]:
shift4[arr, 3]
def benchmark_shift5[]:
shift5[arr, 3]
benchmark_set = ['benchmark_shift1', 'benchmark_shift2', 'benchmark_shift3', 'benchmark_shift4', 'benchmark_shift5']
for x in benchmark_set:
number = 10000
t = timeit.timeit['%s[]' % x, 'from __main__ import %s' % x, number=number]
print '%s time: %f' % [x, t]
0 để điền vào array[[ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan]]
8 sẽ không gây ra bất kỳ vấn đề nào.def shift[xs, n]:
if n >= 0:
return np.concatenate[[np.full[n, np.nan], xs[:-n]]]
else:
return np.concatenate[[xs[-n:], np.full[-n, np.nan]]]
4Đã trả lời ngày 7 tháng 11 năm 2021 lúc 22:42Nov 7, 2021 at 22:42
HÀM NGHIHÀM NGHIHàm Nghi
671 Huy hiệu bạc5 Huy hiệu đồng1 silver badge5 bronze badges
Dưới đây là một khái quát của câu trả lời nhanh [
import numpy as np
from scipy.ndimage.interpolation import shift
xs = np.array[[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]]
shift[xs, 3, cval=np.NaN]
0] để hỗ trợ các mảng đa chiều tùy ý:def shift[xs, n]:
if n >= 0:
return np.concatenate[[np.full[n, np.nan], xs[:-n]]]
else:
return np.concatenate[[xs[-n:], np.full[-n, np.nan]]]
5Đã trả lời ngày 9 tháng 12 năm 2021 lúc 23:17Dec 9, 2021 at 23:17
HugueshuguesHugues
2.55121 huy hiệu bạc33 huy hiệu đồng21 silver badges33 bronze badges
Đây là một giải pháp cho hai chiều không sử dụng các chức năng tích hợp đặc biệt từ Numpy và do đó tương thích với Numba.
def shift[xs, n]:
if n >= 0:
return np.concatenate[[np.full[n, np.nan], xs[:-n]]]
else:
return np.concatenate[[xs[-n:], np.full[-n, np.nan]]]
6
Đã trả lời ngày 28 tháng 3 lúc 15:02Mar 28 at 15:02
Tôi nghĩ rằng tôi có một giải pháp nhanh hơn: Tại sao không chỉ sử dụng deque? Tôi đã thêm 2 điểm chuẩn vào giải pháp điểm chuẩn từ @GZC:
def shift[xs, n]:
if n >= 0:
return np.concatenate[[np.full[n, np.nan], xs[:-n]]]
else:
return np.concatenate[[xs[-n:], np.full[-n, np.nan]]]
7Và trên máy tính xách tay của tôi, đầu ra tốt hơn nhiều so với bất kỳ giải pháp nào khác được đề xuất:
def shift[xs, n]:
if n >= 0:
return np.concatenate[[np.full[n, np.nan], xs[:-n]]]
else:
return np.concatenate[[xs[-n:], np.full[-n, np.nan]]]
8Đã trả lời ngày 6 tháng 2 lúc 12:51Feb 6 at 12:51
AlexalexalEx
1636 Huy hiệu bạc11 Huy hiệu đồng6 silver badges11 bronze badges
3
Một cách để làm điều đó mà không làm đổ mã vào các trường hợp
với mảng:
def shift[xs, n]:
if n >= 0:
return np.concatenate[[np.full[n, np.nan], xs[:-n]]]
else:
return np.concatenate[[xs[-n:], np.full[-n, np.nan]]]
9Với ma trận, nó có thể được thực hiện như thế này:
def shift[xs, n]:
e = np.empty_like[xs]
if n >= 0:
e[:n] = np.nan
e[n:] = xs[:-n]
else:
e[n:] = np.nan
e[:n] = xs[-n:]
return e
0Đã trả lời ngày 21 tháng 12 năm 2019 lúc 12:40Dec 21, 2019 at 12:40
Alon Gwetaalon GwetaAlon Gweta
3372 Huy hiệu bạc7 Huy hiệu đồng2 silver badges7 bronze badges
1