在鏈接的答案,How to set first N elements of array to zero?
數組的解決方案是
y = numpy.array(x)
y[0:n] = 0
在其他如果我們用相同的數字填充切片(指數範圍),我們可以指定一個標量。它可以是相同大小的數組,例如np.ones(n)
。但它不一定是。
所以我們只需要遍歷的a
行(和b
元素),並執行該索引分配
In [368]: a = np.ones((3,4))*np.nan
In [369]: for i in range(3):
...: a[i,:b[i]] = 1
...:
In [370]: a
Out[370]:
array([[ 1., 1., nan, nan],
[ 1., 1., 1., nan],
[ 1., nan, nan, nan]])
有「填充」原陣列nan
的各種方式。np.full
做了np.empty
後跟copyto
。
行迭代的變體是for i,n in enumerate(a):
。
在協調意義上迭代的另一個好方法是使用zip
。
In [371]: for i,x in zip(b,a):
...: x[:i] = 1
這利用了以下事實的優點,關於它的行的二維數組迭代迭代。所以x
是a
的1d視圖,可以在原地更改。
但有一點索引欺騙,我們甚至不必循環。
In [373]: a = np.full((3,4),np.nan)
In [375]: mask = np.array(b)[:,None]>np.arange(4)
In [376]: mask
Out[376]:
array([[ True, True, False, False],
[ True, True, True, False],
[ True, False, False, False]], dtype=bool)
In [377]: a[mask] = 1
In [378]: a
Out[378]:
array([[ 1., 1., nan, nan],
[ 1., 1., 1., nan],
[ 1., nan, nan, nan]])
這是頂級numpy
海報之一,@Divakar
的最愛。
Numpy: Fix array with rows of different lengths by filling the empty elements with zeros
它可以用來pad
列表的列表。說到填充,itertools
有一個方便的工具,zip_longest
(PY 3名)
In [380]: np.array(list(itertools.zip_longest(*[np.ones(x).tolist() for x in b],fillvalue=np.nan))).T
Out[380]:
array([[ 1., 1., nan],
[ 1., 1., 1.],
[ 1., nan, nan]])
你的問題應該已經指定了什麼是錯的;你有什麼樣的錯誤:
for i in w2:
a[0:b[i]] = [1] * b[i]
a[i:] = np.ones((b[i]))
w2
是不確定的,但可能是range(3)
。
a[0:b[i]]
是錯誤的,因爲它指定所有行,因爲您一次只處理一個行。 a[i:]
也指定了一系列的行。
當你發佈這樣的代碼時,你應該說比'它不工作'。什麼問題?什麼樣的錯誤?一個小調整得到它的工作:'對於我在範圍(3):a [i,0:b [i]] = 1'您沒有完全應用鏈接的答案。 – hpaulj
@hpaulj你說得對,我已經添加了它的完整性。如果我使用你的調整,由最後一行引起的錯誤出現'(ValueError:無法從形狀(2)廣播輸入數組到形狀(3,4))''。如果我刪除這一行,確實很好! –
@hpaulj我的壞,它不起作用。整個陣列比填充一個。然而,你的枚舉解決方案完美工作 –