在python

时间:2018-01-04 17:08:39

标签: python-3.x numpy

我想在两个数组之间交换元素,从特定的数组索引值开始,保持数组索引之前的其他值不变。

import numpy as np
r = np.array([10, 20, 30, 40, 50, 60])
p = np.array([70, 80, 90, 100, 110, 120])

t = []
for i in range(len(r)):
    for j in range(len(p)):
        if i >= 3 and j >= 3:
            t.append(p[j])
            p[j] = r[i]
            for k in t:
                r[i] = k

以上代码执行任务但值的顺序相反。 交换后我在数组p中想要的值是:

[70, 80, 90, 40, 50, 60]

和交换后我想要的数组r的值是:

[10, 20, 30, 100, 110, 120]

但是在数组p中我得到了:

[70, 80, 90, 60, 50, 40]

和数组r我得到了:

[10, 20, 30, 120, 110, 100]

我不知道代码有什么问题。

3 个答案:

答案 0 :(得分:3)

import numpy as np
r = np.array([10, 20, 30, 40, 50, 60])
p = np.array([70, 80, 90, 100, 110, 120])

for i in range(len(r)):
    if (i>=3):
        p[i],r[i] = r[i],p[i]

以上代码将为您完成工作。如果我理解你的问题,你不需要为循环和t数组运行两个。你想要的只是交换一些索引。您可以像上面那样交换这些索引,而不需要临时数组。

答案 1 :(得分:2)

您可以在不循环的情况下实现相同目标:

r = np.array([10, 20, 30, 40, 50, 60])
p = np.array([70, 80, 90, 100, 110, 120])

i = 3
temp = p[i:].copy()
p[i:] = r[i:]
r[i:] = temp

现在:

>>> p
array([70, 80, 90, 40, 50, 60])
>>> r
array([ 10,  20,  30, 100, 110, 120])

答案 2 :(得分:1)

您可以将一个阵列的切片复制到另一个阵列:

In [113]: r = np.array([10, 20, 30, 40, 50, 60])
     ...: p = np.array([70, 80, 90, 100, 110, 120])
     ...: 
In [114]: t = p.copy()
In [115]: t[3:]=r[3:]
In [116]: t
Out[116]: array([70, 80, 90, 40, 50, 60])

您也可以加入切片:

In [117]: np.concatenate((p[:3], r[3:]))
Out[117]: array([70, 80, 90, 40, 50, 60])

这些答案会创建一个新数组。我认为这比进行内部交换更清楚。但这是我如何进行交换

In [128]: temp = r[3:].copy()
In [129]: r[3:]=p[3:]
In [130]: p[3:]=temp
In [131]: r
Out[131]: array([ 10,  20,  30, 100, 110, 120])
In [132]: p
Out[132]: array([70, 80, 90, 40, 50, 60])

我在copy中使用temp,否则切片会产生view,这将在下一个副本中被修改。最近在交换2d数组的行时出现了这个问题。

使用列表可以更轻松地进行交换 - 因为r[3:]可以复制。

In [139]: r=r.tolist()
In [140]: p=p.tolist()
In [141]: temp = r[3:]
In [142]: r[3:], p[3:] = p[3:], r[3:]
In [143]: r
Out[143]: [10, 20, 30, 100, 110, 120]
In [144]: p
Out[144]: [70, 80, 90, 40, 50, 60]