簡體   English   中英

如何創建一個 numpy N 維零數組,只有一個元素等於一?

[英]How do I create a numpy N-dimensional array of zeros, with only a single element equal to one?

是否有一種簡短的單行方法來創建 numpy 數組(可能有多個維度),該數組在某個 position 中有一個,而在所有其他數組中都為零? 對於一維數組,可以執行以下操作來創建一個在 k^{th} position 上為 1 的數組:

np.eye(1, N, k = k)

如何將其推廣到更高維的情況?

例如,如果您需要一個索引為 (2, 3) 處為 1 的 3x5 矩陣,只需創建一個 1D 數組,然后對其進行整形:

M, N = 3, 5
i, j = 2, 3
np.eye(1, M * N, k=(i+1) * M + j).reshape(M, N)

array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0.]])

了解每個多維 numpy 數組在內部表示為一維數組可能會有所幫助,並帶有一些包裝邏輯來處理步幅和索引。 這意味着這里的解決方案也可以通過適當的算術推廣到任何維度。 這是一個概括:

def make_nd_array_with(dims, index):
    return (np.eye(1, 
                   np.prod(dims), 
                   k=(((np.array(index[:-1]) + 1) * dims[:-1]).sum() + index[-1]))
              .reshape(*dims))

make_nd_array_with((M,N), (i,j))

array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0.]])

請注意,這解決了您希望在一行中執行此操作的限制,但通常的規范解決方案是創建一個零數組並設置一個值,正如評論和其他答案提到的那樣。

arr = np.zeros(M, N)
arr[i, j] = 1

與其使用eyereshape ,不如編寫一個調用zeros並設置所需元素的 function更加清晰

def mostly_zeros(shape, nonzero_position, dtype=float, nonzero_element=1):
    retval = numpy.zeros(shape, dtype=dtype)
    retval[nonzero_index] = nonzero_element
    return retval

然后,您可以調用mostly_zeros(shape=(4, 5), nonzero_position=(2, 2))以在 position (2, 2) 2, 2) 處獲得一個形狀為(4, 5)的大部分為零的數組,其值為1.0 eye相比,這將是一個少得多的維護頭痛。


或者,您可以編寫一個 function 來設置項目並返回數組:

def chainable_setitem(obj, index, val):
    obj[index] = val
    return obj

然后你可以做chainable_setitem(numpy.zeros((4, 5)), (2, 2), 1)得到一個 4x5 數組,在 position 2、2 處為 1.0,其他地方為零。

由於您要求單線:

np.bincount([np.ravel_multi_index(pos,shp)],None,np.prod(shp)).reshape(shp)

例子

shp = 3,4
pos = 1,2
np.bincount([np.ravel_multi_index(pos,shp)],None,np.prod(shp)).reshape(shp)
# array([[0, 0, 0, 0],
#        [0, 0, 1, 0],
#        [0, 0, 0, 0]])

誠然,這對於 1D 來說要好得多,因為它可以簡化為

np.bincount([pos],None,length)

比 nD

暫無
暫無

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

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