簡體   English   中英

如何用給定索引范圍/切片的零填充 numpy 數組

[英]How to fill numpy array of zeros with ones given index ranges/slices

這個問題與下面提到的另外兩個問題密切相關。 盡管可以對它們進行調整,但我不確定它們能否針對這種特定情況提供最佳解決方案。

給定一個 numpy 的零數組

arr = np.zeros([2, 5])

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

根據另一個范圍數組(或元組列表)填充零

ranges_ones = np.array([[0,3], [1,4]])

結果

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

如何用給定索引范圍/切片的零填充 numpy 數組?

相關問題:

  1. 如何用給定的索引/坐標填充 numpy 零數組
  • 如果將范圍轉換為精確坐標,則可以進行調整
  1. 用另一個數組切片 numpy 數組
  • 如果解決方案被推廣到超過 1 個維度,則可以進行調整。 例如,如果 reduceat 可用於多個 arrays 切片

使用 numpy 廣播,您可以創建一個 boolean 數組,該數組對於您希望為 1 的單元格為 True,否則為 False。 由於ranges_ones的第一列是起始索引,第二列是結束索引,我們可以使用&創建一個區間

idx = np.arange(arr.shape[1])
s = (idx >= ranges_ones[:, [0]]) 
e = (idx <= ranges_ones[:, [1]])
arr[s & e] = 1

Output:

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

您可以根據范圍數組創建切片對象。 結果與您的預期答案不同,因為在切片時不包括范圍的停止值,但很容易調整它,因此結果就是您要查找的結果。

import numpy as np

arr = np.zeros([2, 5])

ranges_ones = np.array([[0,3], [1,4]])

for i, range in enumerate(ranges_ones):
    arr[i, slice(range[0], range[1])] = 1
    # arr[i, range[0]:range[1]] = 1 also works btw

print(arr) # [[1. 1. 1. 0. 0.] [0. 1. 1. 1. 0.]]

一個簡單的enumerate()調用應該可以解決問題:

import numpy as np

arr = np.zeros([2, 5])
ranges_ones = np.array([[0, 4], [1, 4]])

for i, (a, b) in enumerate(ranges_ones):
    arr[i, a: b] = 1
    
print(arr)

Output:

[[1. 1. 1. 1. 0.]
 [0. 1. 1. 1. 0.]]

暫無
暫無

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

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