Numpy学习笔记(四):不同的复制之间的对比

本文深入探讨了Python中NumPy数组的复制方法,包括直接赋值、浅复制和深复制的区别与应用场景,以及如何通过不同方式改变数组而不影响其他变量。此外,还介绍了数组的排序和索引操作,展示了数据排序、查找最大值和使用索引选取元素的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于python语言自身的特性,通过赋值的方式, 复制一个变量,其只是将不同的变量名同时指向了一个存储地址,当两个变量中的任意一个变量改变内容的时候,所有指向这个内容的变量都将会发生变化。因此如何能像c语言中那样实现变量的任意改变,并不影响其他变量,是现在要实现的。
复制

#不同的变量,但是指定的位置是相同的
a=np.arange(12)
b=a
print(b is a)
b.shape=(3,4)
print(a.shape)
print(id(a))
print(id(b))

运行结果:

True
(3, 4)
2363408075552
2363408075552

**
从上述的运行结果可以看出不同的变量指向了同一块内存地址,任意的变量都可以改变内存地址里的内容

浅复制

**

#不同的变量指向不同的位置,位置里共享的内容是一样的
c=a.view() #浅复制
print(c is a)
c.shape=(2,6)
print(a.shape)
c[0,4]=1234
print(a)
print(id(a))
print(id(c))

运行结果:

False
(3, 4)
[[   0    1    2    3]
 [1234    5    6    7]
 [   8    9   10   11]]
2363408075552
2363408074752

上述结果表明,通过浅复制,使得变量的内存地址不一样,但是依旧是一个变量改变影响了另一个。
通过copy的形式可实现完全复制

d =a.copy()
d is a
d[0,0]=999
print(a)
print(d)

运行结果:

[[   0    1    2    3]
 [1234    5    6    7]
 [   8    9   10   11]]
[[ 999    1    2    3]
 [1234    5    6    7]
 [   8    9   10   11]]

**

排序和索引:

**

#数据的排序和索引
data = np.sin(np.arange(20).reshape(5,4))
print(data)
ind =data.argmax(axis=0) #按列查找最大值返回的是行
print(ind)
data_max=data[ind,range(data.shape[1])]#使用索引值查找元素,rangw是查找列
print(data_max)

运行结果:

[[ 0.          0.84147098  0.90929743  0.14112001]
 [-0.7568025  -0.95892427 -0.2794155   0.6569866 ]
 [ 0.98935825  0.41211849 -0.54402111 -0.99999021]
 [-0.53657292  0.42016704  0.99060736  0.65028784]
 [-0.28790332 -0.96139749 -0.75098725  0.14987721]]
[2 0 3 1]
[0.98935825 0.84147098 0.99060736 0.6569866 ]
4

**

排序:

**

#排序
a = np.array([[4,3,5],[1,2,1]])
print(a)
print('-'*10)
b=np.sort(a,axis=1)#按照行排序
print(b)
a.sort(axis=1)
print('-'*10)
print(a)
a=np.array([4,3,1,2]) 
j=np.argsort(a)#默认是从小到大排序,返回的是位置
print('-'*10)
print(j)
print('-'*10)
print([j])

运行结果:

[[4 3 5]
 [1 2 1]]
----------
[[3 4 5]
 [1 1 2]]
----------
[[3 4 5]
 [1 1 2]]
----------
[2 3 1 0]
----------
[array([2, 3, 1, 0], dtype=int64)]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脑咖学术基地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值