簡體   English   中英

為每個數據列填充一個帶有偏移量的numpy數組

[英]Padding a numpy array with offsets for each data column

我正在使用2D numpy數組,這些數組在行數和列數方面表現出可變的大小。 我想在第一行的開始之前和最后一行的結尾處都用零填充該數組,但是我希望零的開始/結束以不同的方式針對數據。

因此原始的2D數組:

1 2 3 
4 5 6
7 8 9

填充的普通示例:

0 0 0
0 0 0
1 2 3
4 5 6
7 8 9
0 0 0

帶有偏移量的修改填充(我正在嘗試做的事情):

0 0 0
1 0 0 
4 0 3
7 2 6
0 5 9
0 8 0

numpy是否具有任何可以以可擴展方式復制最后一個示例的函數,用於可變數量的行/列,從而避免使用for循環/其他計算緩慢的方法?

這是一個帶有broadcastingboolean-indexing的矢量化-

def create_padded_array(a, row_start, n_rows):
    r = np.arange(n_rows)[:,None]
    row_start = np.asarray(row_start)
    mask = (r >= row_start) & (r < row_start+a.shape[0])

    out = np.zeros(mask.shape, dtype=a.dtype)
    out.T[mask.T] = a.ravel('F')
    return out   

樣品運行-

In [184]: a
Out[184]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

In [185]: create_padded_array(a, row_start=[1,3,2], n_rows=6)
Out[185]: 
array([[0, 0, 0],
       [1, 0, 0],
       [4, 0, 3],
       [7, 2, 6],
       [0, 5, 9],
       [0, 8, 0]])

很抱歉給您帶來麻煩,但我想我找到了所要的答案。

我可以使用numpy.pad在原始數組的末尾創建任意數量的填充零。 還有一個名為numpy.roll的函數,該函數隨后可用於沿給定軸將所有數組元素沿列向下移動一定數量的位置。

快速測試后,它看起來可以擴展到任意數量的矩陣元素,並允許沿每一列的唯一偏移量。

感謝大家對這個問題的回答!

據我所知,沒有這些numpy函數具有這些確切的特定要求,但是您可以做的是擁有數組:

`

In [10]: arr = np.array([(1,2,3),(4,5,6),(7,8,9)])

In [11]: arr

Out[11]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])`

然后墊上它:

In [12]: arr = np.pad(arr, ((2,1),(0,0)), 'constant', constant_values=(0))

In [13]: arr
Out[13]: 
array([[0, 0, 0],
       [0, 0, 0],
       [1, 2, 3],
       [4, 5, 6],
       [7, 8, 9],
       [0, 0, 0]])

然后,您可以使用shuffle隨機化(我假設這是您想要做的事情):但是np.random.shuffle僅在滿足您需求的情況下才對行進行隨機排序,然后:

In [14]: np.random.shuffle(arr)
In [15]: arr
Out[15]: 
array([[7, 8, 9],
       [4, 5, 6],
       [0, 0, 0],
       [0, 0, 0],
       [0, 0, 0],
       [1, 2, 3]])

如果這不令人滿意,則可以執行以下操作:


首先創建一維數組:

In [16]: arr = np.arange(1,10)

In [17]: arr
Out[17]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])

然后用零填充數組:

In [18]: arr = np.pad(arr, (6,3), 'constant', constant_values = (0))

In [19]: arr
Out[19]: array([0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0])

然后,您將數組隨機播放:

In [20]: np.random.shuffle(arr)

In [21]: arr
Out[21]: array([4, 0, 0, 5, 0, 0, 3, 0, 0, 0, 8, 0, 7, 2, 1, 6, 0, 9])

最后,您將形狀調整為所需的格式:

In [22]: np.reshape(arr,[6,3])
Out[22]: 
array([[4, 0, 0],
       [5, 0, 0],
       [3, 0, 0],
       [0, 8, 0],
       [7, 2, 1],
       [6, 0, 9]])

盡管這似乎很冗長,但是對於大型數據集而言,這比用於循環或任何其他python控制結構的速度要快得多。 當您說偏移量時,如果您想更改隨機量,則可以選擇只對1D數組的一部分進行混洗,然后將其與其余數據合並,這樣就不會對整個數據集進行混洗,而只是對一部分數據進行混洗洗牌是。 (如果您所說的偏移量與我上面的假設不同,請在評論中進行說明)

暫無
暫無

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

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