鱼C论坛

 找回密码
 立即注册
查看: 871|回复: 17

求问,python中,列表的分片和矩阵的分片为什么不一样啊

[复制链接]
发表于 2018-9-6 22:03:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
甲鱼老师上课讲过,用过分片得到的新列表(b = a[:])是不会随a的内容的变化而变化的,但为什么同样操作的矩阵,(b = a[:]),b甲鱼老师上课讲过,用过分片得到的新列表(b = a[:])是不会随a的内容的变化而变化的,但为什么同样操作的矩阵,(b = a[:]),b的内容改变,a的内容就变了呢?的内容改变,a的内容就变了呢?
import numpy as np
>>> a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
>>> print(a)
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
>>> b = a[:,:]
>>> print(b)
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
>>> b[0,0] = 44
>>> print(b)
[[44  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
>>> print(a)
[[44  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-6 22:54:05 | 显示全部楼层
切片是【:】,用【,】变成下标了……自己搞错啦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-6 22:59:47 | 显示全部楼层
claws0n 发表于 2018-9-6 22:54
切片是【:】,用【,】变成下标了……自己搞错啦~

切片是[...,x]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-7 02:07:39 | 显示全部楼层

但是,对于一个矩阵,要分别对行和列进行切片欸,所以要有两个部分,中间用逗号分开,我试了一下,即使写成b = a[:],得到的矩阵还是联动的,和列表不一样。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-7 03:31:11 | 显示全部楼层
lanlan_lanlan 发表于 2018-9-7 02:07
但是,对于一个矩阵,要分别对行和列进行切片欸,所以要有两个部分,中间用逗号分开,我试了一下,即使写 ...
import numpy as np

a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
b = a[:,0]
c = a[0,:]
d = a[0,0:2]
>>> a
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])
>>> b
array([1, 5, 9])
>>> c
array([1, 2, 3, 4])
>>> d
array([1, 2])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-7 08:04:26 | 显示全部楼层
2层深度及以上的地址内容还是指向一个地方
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-7 09:28:48 | 显示全部楼层

他的问题是,为什么改变b的值会导致a的值也会发生变化。  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-7 09:32:46 | 显示全部楼层
wongyusing 发表于 2018-9-7 09:28
他的问题是,为什么改变b的值会导致a的值也会发生变化。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-7 09:34:20 | 显示全部楼层
数据结构不一样 array 才是真正的数组,python 的 list 是双向链表。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-7 09:34:42 | 显示全部楼层

我测试了一下,我自己也蒙比了。
我们一直在改变b的值,都不去操作a。  
为什么a的值就改变了呢??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-7 09:53:13 | 显示全部楼层
本帖最后由 claws0n 于 2018-9-7 09:55 编辑
wongyusing 发表于 2018-9-7 09:34
我测试了一下,我自己也蒙比了。
我们一直在改变b的值,都不去操作a。  
为什么a的值就改变了呢??


python 是 C 写的。numpy 作为一个特别处理运算的模组,也延续了 C 的多数方法。如果你用 numpy array 去处理数据,你就会发现到它的效能远远超越 list。问题来了,python 不像 C 语言,需要声明变量的大小,也就是说这个 array 可以一直扩展(只要空间足够)。那么如果要处理数据,不可能只有一个矩阵,所以为了避免空间的浪费以及运算效率的考量,在面对 array 时,跟 C 一样,面对的是指针。指针在 python 叫标签吧~

如果你确定要复制一份,b = a.copy()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-7 09:54:07 | 显示全部楼层
本帖最后由 wongyusing 于 2018-9-7 09:56 编辑
claws0n 发表于 2018-9-7 09:34
数据结构不一样 array 才是真正的数组,python 的 list 是双向链表。


不用numpy的情况一样的,都会是改变a的值
Python 3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [[1,2,3,4], [5,6,7,8], [9,10,11,12]]
>>> print(a)
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
>>> b = a
>>> print(b)
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
>>> b[0][0] = 44
>>> print(b)
[[44, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
>>> print(a)
[[44, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-7 10:11:56 | 显示全部楼层
wongyusing 发表于 2018-9-7 09:54
不用numpy的情况一样的,都会是改变a的值

但是 array 对 list 是相容的,所以内部也是一个数组

a = [[A] ,[B],[C],[D]]
b = a[::]   >>  id(b) != id(a)
但是  id(b[0][0]) == id(a[0][0])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-7 21:58:04 | 显示全部楼层
claws0n 发表于 2018-9-7 09:53
python 是 C 写的。numpy 作为一个特别处理运算的模组,也延续了 C 的多数方法。如果你用 numpy array  ...

我还是用。copy()比较保险
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-8 09:25:42 From FishC Mobile | 显示全部楼层
copy()也一样,要用copy模块里的deepcopy()(深拷贝),具体比较复杂,可以搜索浅拷贝和深拷贝
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-9 00:27:24 From FishC Mobile | 显示全部楼层
我觉得是对于嵌套列表的拷贝是贴标签。不像一维的是拷贝出来。试一试以下的例子。
a = [[2, 3, 4], 5, 6]
b = a[:]
b[0][0] = 1
请问此时a[0][0]是多少?
b[1] = 4
此时a[1]为多少?
c = a[1:]
c.insert(0, a[0][:])
c[0][0] = 9
这时a[0][0]为多少?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-9 00:33:21 From FishC Mobile | 显示全部楼层
对于二维的切片,拷贝出来的是地址。
对于一维的切片,拷贝出来的是数据。
应该可以这么理解吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-9 00:34:05 From FishC Mobile | 显示全部楼层
我的第一条评论有个逻辑错误。见谅
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 22:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表