![](/img/trans.png)
[英]How to find the indices of the i-th largest element of an n-dimensional numpy array?
[英]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
與其使用eye
或reshape
,不如編寫一個調用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.