[英]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.