我一直在尋找解決這個問題的方法。我試圖在我的代碼中使用盡可能少的回圈,所以我一直在嘗試設定 numpy 陣列的切片。
我有一個大陣列 (s, s, s, s),但您可以將其視為將 2d sxs 陣列存盤在一個更大的 sxs 陣列中的每個點內。
我想在較大陣列中的每個位置存盤一個小 sxs,其中包含來自 other_array [大陣列中的位置] 的標量值。
例如,讓我們想象一個大的 2x2 陣列,每個點包含 2x2 陣列。在點 (0,0),我需要創建一個 2x2 陣列,其中包含 other_array[(0,0)] 值。
使用陣列切片的簡單方法是什么?這是我要簡化的內容:
pair_values = np.zeros((num_s, num_s, num_s, num_s))
for x in range(num_s):
for y in range(num_s):
pair_values[x,y] = np.full((num_s, num_s), values[(x, y)])
現在這是我的代碼,但我不知道為我的“值”陣列的索引放什么:
pair_values = np.zeros((num_s, num_s, num_s, num_s))
pair_values[:, :] = np.full((num_s, num_s), values[?])
請讓我知道這是否令人困惑,我會嘗試改寫。本質上,問題是在使用 (:) 進行切片時如何使用每個索引。
uj5u.com熱心網友回復:
您的迭代產生:
In [12]: num_s=2
In [15]: values = np.arange(1,5).reshape(2,2)*10
In [16]: pair_values = np.zeros((num_s, num_s, num_s, num_s))
...: for x in range(num_s):
...: for y in range(num_s):
...: pair_values[x,y] = np.full((num_s, num_s), values[(x, y)])
...:
In [17]: pair_values
Out[17]:
array([[[[10., 10.],
[10., 10.]],
[[20., 20.],
[20., 20.]]],
[[[30., 30.],
[30., 30.]],
[[40., 40.],
[40., 40.]]]])
一對索引的位置:
In [18]: pair_values[0,1]
Out[18]:
array([[20., 20.],
[20., 20.]])
In [19]: values[0,1]
Out[19]: 20
首先嘗試一次填充整個陣列:
In [20]: res = np.zeros((num_s,num_s,num_s,num_s))
In [21]: res[:,:] = values
In [22]: res
Out[22]:
array([[[[10., 20.],
[30., 40.]],
[[10., 20.],
[30., 40.]]],
[[[10., 20.],
[30., 40.]],
[[10., 20.],
[30., 40.]]]])
錯誤的布局 - 盡管我們可以transpose用來獲得正確的布局。
但是通過添加維度,values我們可以根據需要得到它broadcast:
In [23]: res[:,:] = values[:,:,None,None]
In [24]: res
Out[24]:
array([[[[10., 10.],
[10., 10.]],
[[20., 20.],
[20., 20.]]],
[[[30., 30.],
[30., 30.]],
[[40., 40.],
[40., 40.]]]])
另一種方法是tile(或repeat)擴展values陣列:
In [25]: np.tile(values[:,:,None,None],(1,1,num_s,num_s))
Out[25]:
array([[[[10, 10],
[10, 10]],
[[20, 20],
[20, 20]]],
[[[30, 30],
[30, 30]],
[[40, 40],
[40, 40]]]])
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/519625.html
上一篇:將變數放入陣列并找到最大值
下一篇:如何使用Numpy創建如下矩陣
