Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.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中似乎无法交换记录数组中的行_Python_Arrays_Numpy - Fatal编程技术网

在Python中似乎无法交换记录数组中的行

在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'

似乎无法交换表中的两行。如您所见,位置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', 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]]