在 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])
如何使用切片将 多个 元素更改为特定值?
例如:将每五个元素出现的第零个、第一个和第二个元素从第一个元素开始更改为 100。我想要这样:
array([0, 100, 100, 100, 4, 5, 100, 100, 100, 9])
我尝试了 arr_1[1::[5, 6, 7]] = 100
但那不起作用。
这是 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])
根据您的操作,这是另一个解决方案:
arr_1 = np.arange(10)
arr_1[1::5] = 100
arr_1[2::5] = 100
arr_1[3::5] = 100
它 returns :
array([ 0, 100, 100, 100, 4, 5, 100, 100, 100, 9])
您只需将索引列表包装在 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 所示。
如果您的重复偏移量除以数组长度:
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
工作原理:以所述方式重塑阵列的连续延伸,使目标子延伸对齐,因此可以使用标准二维索引一次性解决:
>>> a = np.arange(15)
>>> a.reshape((-1, 5))
array([[ 0, 1x, 2x, 3x, 4],
[ 5, 6x, 7x, 8x, 9],
[10, 11x, 12x, 13x, 14]])
假设我有 numpy
数组 arr_1 = np.arange(10)
返回:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
如何使用切片将 多个 元素更改为特定值?
例如:将每五个元素出现的第零个、第一个和第二个元素从第一个元素开始更改为 100。我想要这样:
array([0, 100, 100, 100, 4, 5, 100, 100, 100, 9])
我尝试了 arr_1[1::[5, 6, 7]] = 100
但那不起作用。
这是 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])
根据您的操作,这是另一个解决方案:
arr_1 = np.arange(10)
arr_1[1::5] = 100
arr_1[2::5] = 100
arr_1[3::5] = 100
它 returns :
array([ 0, 100, 100, 100, 4, 5, 100, 100, 100, 9])
您只需将索引列表包装在 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 所示。
如果您的重复偏移量除以数组长度:
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
工作原理:以所述方式重塑阵列的连续延伸,使目标子延伸对齐,因此可以使用标准二维索引一次性解决:
>>> a = np.arange(15)
>>> a.reshape((-1, 5))
array([[ 0, 1x, 2x, 3x, 4],
[ 5, 6x, 7x, 8x, 9],
[10, 11x, 12x, 13x, 14]])