Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用切片更改多个Numpy数组元素_Python_Arrays_Numpy_Slice - Fatal编程技术网

在Python中使用切片更改多个Numpy数组元素

在Python中使用切片更改多个Numpy数组元素,python,arrays,numpy,slice,Python,Arrays,Numpy,Slice,假设我有numpy数组arr\u 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,但没有成功。这里有一种方法- 使用原始样本运行样本- In [

假设我有
numpy
数组
arr\u 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
,但没有成功。

这里有一种方法-

使用原始样本运行样本-

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])
使用
非顺序索引运行示例

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
它返回:

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数组构造函数中即可。有关详细信息,请参见下文。是的,切片参数必须是数字,而不是列表。对于范围(3)中的i:arr_1[i::5]=100,切片参数必须是循环形式的
。如果循环的数量足够小于
arr_1
的长度,则应比“更高级”的解决方案快。
>>> a = np.arange(15)
>>> a.reshape((-1, 5))
array([[ 0,  1x,  2x,  3x,  4],
       [ 5,  6x,  7x,  8x,  9],
       [10, 11x, 12x, 13x, 14]])