在numpy数组中,无需使用循环将所有奇数或偶数索引元素加上一个数字

14

假设你的numpy数组如下:

 A =    [1,1,2,3,4]

你可以简单地执行:

A + .1

以将一个数字添加到每个元素的numpy数组中。

我正在寻找一种方法,以将一个数字添加到只有奇数或偶数索引号A[::2] +1的数字中,同时保持整个数组不变。

是否可能在没有任何循环的情况下向所有奇数或偶数索引元素添加一个数字?


为什么需要避免使用循环?你能展示一下你的代码吗?你想在代码中的哪里实现这个? - Inbar Rose
1
“while keeping the entire array intact” 是什么意思?你是否排除了原地操作? - DSM
4个回答

25
In [43]: A = np.array([1,1,2,3,4], dtype = 'float')

In [44]: A[::2]  += 0.1

In [45]: A
Out[45]: array([ 1.1,  1. ,  2.1,  3. ,  4.1])

请注意,这会修改A。如果您希望保留原始的A,请先复制一份:

In [46]: A = np.array([1,1,2,3,4], dtype = 'float')

In [47]: B = A.copy()

In [48]: B[::2]  += 0.1

In [49]: B
Out[49]: array([ 1.1,  1. ,  2.1,  3. ,  4.1])

In [50]: A
Out[50]: array([ 1.,  1.,  2.,  3.,  4.])

如果我们有一个二维数组,如果 j+j 是偶数,我们加零怎么办? - Paulo

16
除了之前的回答之外,要修改奇数索引位置的数字,您应该使用 A[1::2] 而不是 A[::2]。

2

使用列表推导式可能会起作用。

A = [1,1,2,3,4]
A = [A[i] + (0 if (i%2 == 0) else .1) for i in range(len(A))]

只需使用三元运算符就能快速且简单地完成。可能不适用于你所使用的Python版本,我记不清它适用于哪些版本。


在Python 2.7.3和Python 3.2.3中进行了检查,输出结果相同:

>>> A = [1,1,2,3,4]

>>> A
[1, 1, 2, 3, 4]

>>> A = [A[i] + (0 if (i%2 == 0) else .1) for i in range(len(A))]

>>> A
[1, 1.1, 2, 3.1, 4]

啊,我错过了numpy数组的部分。第一个答案更好。我的错。 - DrGodCarl

0
如果列表不以两个1开头,并且您想要对所有偶数进行添加,您可以使用以下代码:
A[1::2] += 0.1

或者

A[::-2][::-1] += 0.1

在后一种情况下,[::-1] 用于将数组反转回正常顺序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接