Hướng dẫn how do you shift elements in a matrix in python? - làm thế nào để bạn chuyển các phần tử trong một ma trận trong python?

116

Show

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

Hướng dẫn how do you shift elements in a matrix in python? - làm thế nào để bạn chuyển các phần tử trong một ma trận trong python?

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

Hướng dẫn how do you shift elements in a matrix in python? - làm thế nào để bạn chuyển các phần tử trong một ma trận trong python?

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(len(arr)+num,len(arr)),np.nan)
    elif 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

Hướng dẫn how do you shift elements in a matrix in python? - làm thế nào để bạn chuyển các phần tử trong một ma trận trong python?

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 (
    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
    
    6) là giải pháp chậm nhất được liệt kê trong trang này.
  • 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.

Hướng dẫn how do you shift elements in a matrix in python? - làm thế nào để bạn chuyển các phần tử trong một ma trận trong python?

2. Điểm chuẩn chi tiết với các tùy chọn tốt nhất

  • Chọn
    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 (được xác định bên dưới) nếu bạn muốn tốt tất cả

Hướng dẫn how do you shift elements in a matrix in python? - làm thế nào để bạn chuyển các phần tử trong một ma trận trong python?

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

  • 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
  • CAVEAT: Numba Jit (chỉ trong trình biên dịch thời gian) sẽ chỉ tăng hiệu suất nếu bạn gọi chức năng được trang trí nhiều lần. Cuộc gọi đầu tiên mất thường dài hơn 3-4 lần so với các cuộc gọi tiếp theo. Bạn có thể nhận được nhiều hiệu suất hơn nữa với thời gian đã biên soạn numba.
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])
0

3.2. 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 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.
  • CAVEAT: Numba Jit (chỉ trong trình biên dịch thời gian) sẽ chỉ tăng hiệu suất nếu bạn gọi chức năng được trang trí nhiều lần. Cuộc gọi đầu tiên mất thường dài hơn 3-4 lần so với các cuộc gọi tiếp theo. Bạn có thể nhận được nhiều hiệu suất hơn nữa với thời gian đã biên soạn numba.
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])
1

3.2. 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 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. 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

Phương pháp tốt nhất với kích thước mảng ~ 20.000

  • Giống 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
    
    9, chỉ cần loại bỏ công cụ trang trí @numba.njit.
  • 4 Phụ lục
  • 4.1 Chi tiết về các phương pháp đã 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)
    
    2:
    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
    
    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.
  • 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)
    
    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 & GZC
  • 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:
    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 IronManmark20
  • array([ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.])
    
    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 GZC

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 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) 0: Sử dụng hai lần array([ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]) 7 bởi ChrisayCock

array([ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]) 8: @numba.njit Phiên bản trang trí trước đó.

  • 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 và
    array([ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.])
    
    0 chứa các chức năng không được hỗ trợ bởi Numba hiện tại (0,50.1).
  • 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

Hướng dẫn how do you shift elements in a matrix in python? - làm thế nào để bạn chuyển các phần tử trong một ma trận trong python?

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])
2

Tuy 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])
3

Sau 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

Hướng dẫn how do you shift elements in a matrix in python? - làm thế nào để bạn chuyển các phần tử trong một ma trận trong python?

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])
5

Sử 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])
6

Sử 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])
7

Trong 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])
8

Giả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

Hướng dẫn how do you shift elements in a matrix in python? - làm thế nào để bạn chuyển các phần tử trong một ma trận trong python?

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])
9

Example::

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)))
0

Timeit::

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)))
1

Lưu ý: Nếu bạn không cần tê, chỉ với Numpy, sau đó xóa dòng

array([  3.,   4.,   5.,   6.,   7.,   8.,   9.,  nan,  nan,  nan])
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])
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ầ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)))
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)))
3

Về 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(len(arr)+num,len(arr)),np.nan)
    elif 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)))
7

Và 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)))
9

Vớ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

Làm thế nào để bạn chuyển dữ liệu trong một mảng trong Python?

Làm thế nào để chuyển các yếu tố trong một danh sách trong Python..
A_List = Bộ sưu tập.Deque ([1, 2, 3, 4, 5]).
một danh sách.xoay (2) dịch chuyển `a_list` 2 vị trí sang phải ..
shifted_list = list (a_list).
print(shifted_list).

Làm thế nào để bạn thay đổi các yếu tố trong một mảng 2D trong Python?

Để chuyển các phần của các phần tử mảng của mảng 2D sang trái, hãy sử dụng phương thức numpy.left_shift () trong Python Numpy.Các bit được dịch chuyển sang trái bằng cách nối thêm X2 0S ở bên phải của X1.Vì biểu diễn nội bộ của các số ở định dạng nhị phân, hoạt động này tương đương với việc nhân x1 với 2 ** x2.use the numpy. left_shift() method in Python Numpy. Bits are shifted to the left by appending x2 0s at the right of x1. Since the internal representation of numbers is in binary format, this operation is equivalent to multiplying x1 by 2**x2.

Làm thế nào để bạn chuyển đổi hàng và cột của một ma trận trong Python?

Để chuyển rumpy mảng ndarray (hàng hoán đổi và cột), sử dụng thuộc tính T (.t), phương thức ndarray chuyển vị trí () và hàm numpy.transpose ().use the T attribute ( . T ), the ndarray method transpose() and the numpy. transpose() function.

Làm thế nào để bạn chuyển đổi các cột trong một ma trận trong Python?

Cách tiếp cận :..
Nhập mô -đun Numpy ..
Tạo một mảng numpy ..
Trao đổi cột với chỉ mục ..
In mảng cuối cùng ..