由于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)]