簡體   English   中英

使用Python中的切片更改多個Numpy數組元素

[英]Changing multiple Numpy array elements using slicing in Python

假設我有numpy數組arr_1 = np.arange(10)返回:

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

如何使用切片將多個元素更改為特定值?

例如:將從第一個元素開始每五個元素出現的第0個,第一個和第二個元素更改為100.我想要這樣:

array([0, 100, 100, 100, 4, 5, 100, 100, 100, 9])

我試過arr_1[1::[5, 6, 7]] = 100但這不起作用。

以下是基於您所做的另一種解決方案:

arr_1 = np.arange(10)
arr_1[1::5] = 100
arr_1[2::5] = 100
arr_1[3::5] = 100

它返回:

array([  0, 100, 100, 100,   4,   5, 100, 100, 100,   9])

如果重復偏移量除以數組長度:

a.reshape((-1, 5))[:, 1:4] = 100

一般情況需要兩行:

a[: len(a) // 5 * 5].reshape((-1, 5))[:, 1:4] = 100
a[len(a) // 5 * 5 :][1:4] = 100    

工作原理:以所描述的方式重新整形堆疊數組的連續延伸,使目標基本對齊,因此可以使用標准的2d索引一次解決:

>>> a = np.arange(15)
>>> a.reshape((-1, 5))
array([[ 0,  1x,  2x,  3x,  4],
       [ 5,  6x,  7x,  8x,  9],
       [10, 11x, 12x, 13x, 14]])

這是masking的一種方法 -

a = np.arange(10)       # Input array
idx = np.array([0,1,2]) # Indices to be set
offset = 1              # Offset

a[np.in1d(np.mod(np.arange(a.size),5) , idx+offset)] = 100

樣品與原始樣品一起運行 -

In [849]: a = np.arange(10)       # Input array
     ...: idx = np.array([0,1,2]) # Indices to be set
     ...: offset = 1              # Offset
     ...: 
     ...: a[np.in1d(np.mod(np.arange(a.size),5) , idx+offset)] = 100
     ...: 

In [850]: a
Out[850]: array([  0, 100, 100, 100,   4,   5, 100, 100, 100,   9])

使用non-sequential indices運行的示例 -

In [851]: a = np.arange(11)       # Input array
     ...: idx = np.array([0,2,3]) # Indices to be set
     ...: offset = 1              # Offset
     ...: 

In [852]: a[np.in1d(np.mod(np.arange(a.size),5) , idx+offset)] = 100

In [853]: a
Out[853]: array([  0, 100,   2, 100, 100,   5, 100,   7, 100, 100,  10])

您只需要在np.array(list)中包裝索引列表。 你非常接近正確:

In [2]: arr_1 = np.arange(10)

In [3]: arr_1[np.array([0,1,2,5,6,7])] = 100

In [4]: arr_1
Out[4]: array([100, 100, 100,   3,   4, 100, 100, 100,   8,   9])

我根據您的要求使用手工編碼的索引值。 您可以使用您喜歡的某種技術以自動方式獲取索引,如Divakar所示。

暫無
暫無

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

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