在Python中似乎无法交换记录数组中的行
似乎无法交换表中的两行。如您所见,位置1成功复制到位置0,但不是相反?每个位置的数据都是在交换之前存储的,因此计算机不会将新覆盖的数据放入新位置 代码: 输出:在Python中似乎无法交换记录数组中的行,python,arrays,numpy,Python,Arrays,Numpy,似乎无法交换表中的两行。如您所见,位置1成功复制到位置0,但不是相反?每个位置的数据都是在交换之前存储的,因此计算机不会将新覆盖的数据放入新位置 代码: 输出: ``` ORIGIONAL LIST: [('Alice1', 25, 55. ) ('Bob', 45, 85.5) ('Cathy', 100, 68. ) ('Doug', 19, 61.5)] NEW SWAPPED LIST: [('Bob', 45, 85.5) ('Bob', 45, 85.5) ('Cathy'
```
ORIGIONAL LIST: [('Alice1', 25, 55. ) ('Bob', 45, 85.5) ('Cathy', 100, 68. )
('Doug', 19, 61.5)]
NEW SWAPPED LIST: [('Bob', 45, 85.5) ('Bob', 45, 85.5) ('Cathy', 100, 68. )
('Doug', 19, 61.5)]
```
您可以使用:
您在代码中存储的是元组对象,而不是它的内容。因此,当交换第一个元素
data[0]=pos1
时,pos0
的内容也会发生变化(它指向的是对象而不是内容)。如果要交换内容,请使用“复制”:
from copy import deepcopy
pos0 = deepcopy(data[0])
pos1 = deepcopy(data[1])
data[0] = pos1
data[1] = pos0
输出:
print(data)
[('Bob', 45, 85.5) ('Alice1', 25, 55. ) ('Cathy', 100, 68. )
('Doug', 19, 61.5)]
第一对赋值创建对数据行的引用。第二对赋值更改数据行的内容。因此,引用
pos0
现在指的是数据[0]
,当它被分配到数据[1]
时,它的内容被更新
Python中交换东西的通常方式如下
data[0],data[1]=data[1],data[0]
但是这也不适用于numpy
数组,所以
data[:2]=数据[1::-1]
这似乎是正确的解决方案。索引片
1::-1
表示第一个索引:最后一个索引:增量
,其中最后一个索引未指定。这对可读性有什么影响
data[[0,1]] = data[[1,0]]
这在某种程度上与不可变对象的惯用语
a,b=b,a
相同,因为它为了清晰起见牺牲了速度(制作了一些不必要的副本)。我不同意“两种方式看起来都是完全可以接受的代码”的说法。第二种方式可读性差得多。我更新了答案,当我意识到只有第二个执行它在numpy
数组上应该执行的操作时。我不确定是否有更可读的版本。从技术上讲,这些不是数组行。这是一个1d数组,具有复合数据类型。但问题是类似的data[0]
是数据的视图。一份(第二份)就足够了。data[0]
是一个数组元素,键入numpy.void
,尽管它显示为元组<代码>数据[0]。复制()
就足够了。
print(data)
[('Bob', 45, 85.5) ('Alice1', 25, 55. ) ('Cathy', 100, 68. )
('Doug', 19, 61.5)]
data[[0,1]] = data[[1,0]]