我想在两个数组之间交换元素,从特定的数组索引值开始,保持数组索引之前的其他值不变。
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]
我不知道代码有什么问题。
答案 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]