簡體   English   中英

從給定的數組創建一個“包裝”的ndarray

[英]Create a “wrapped” ndarray from a given array

我試圖通過使用滾動的給定數組作為指定行尺寸的2D數組的行,從數組創建2D數組。 例如:

r = np.array([1,2,3,4])

想要3行矩陣(使用r)作為

[[2,3,4,1],
 [1,2,3,4],
 [4,1,2,3]]

我想我有一個想法,就是使用numpy.roll和for循環定義一個函數,但是由於我的2D數組將變得非常大,所以我試圖避免這種情況。 如果可能,我希望能夠向后滾動。

有沒有辦法使用numpy函數來代替呢? 任何建議對此表示贊賞。

如果使用SciPy的是一個選項,你可以使用scipy.linalg.circulant 您仍然必須微調circulant的參數以獲取所需的內容,因為circulant只是使給定的一維參數成為平方循環矩陣的第一列。

例如:

In [25]: from scipy.linalg import circulant

In [26]: r = np.array([1,2,3,4])

這是circulant給出的:

In [27]: circulant(r)
Out[27]: 
array([[1, 4, 3, 2],
       [2, 1, 4, 3],
       [3, 2, 1, 4],
       [4, 3, 2, 1]])

np.roll()幫助下,您可以獲得所需的數組:

In [28]: circulant(np.roll(r, -1)).T[:-1]
Out[28]: 
array([[2, 3, 4, 1],
       [1, 2, 3, 4],
       [4, 1, 2, 3]])

要么:

In [29]: circulant(np.roll(r[::-1], -1))[1:]
Out[29]: 
array([[2, 3, 4, 1],
       [1, 2, 3, 4],
       [4, 1, 2, 3]])

這是解決問題辦法。 它使用numpy的vstack將行合並為一個數組。 它可能不是最有效的(我不知道res = np.vstack((res, r))的效率)

import numpy as np

def main():
    r = np.array([1,2,3,4])
    x = [i for i in range(1, len(r))] + [0]           # Forwards
    # x = [len(r)-1] + [i for i in range(len(r)-1)]     # Backwards
    r = r[x]
    res = r
    for c in range(2):
        r = r[x]
        res = np.vstack((res, r))
    print res
    return 0

if __name__ == '__main__':
    main()

它產生:

[[2 3 4 1]     'Forwards'
 [3 4 1 2]
 [4 1 2 3]]

[[4 1 2 3]     'Backwards'
 [3 4 1 2]
 [2 3 4 1]]

要更改順序,只需更改x =行。

這是使用列表索引的簡單解決方案。

r = [1, 2, 3, 4] # note: a list, so we can easily concatenate
result = np.array([r[i:] + r[:i] for i in range(1, len(r))])

array([[2, 3, 4, 1],
       [3, 4, 1, 2],
       [4, 1, 2, 3]])

這非常靈活,因為索引對於i負值仍然有意義。 因此,您只需要弄亂range即可獲得所需的開始行和停止行以及方向。

特別是,要獲得准確的結果,您需要:

np.array([r[i:] + r[:i] for i in range(1, -len(r) + 2, -1)])

array([[2, 3, 4, 1],
       [1, 2, 3, 4],
       [4, 1, 2, 3]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM