1.shape=(2,)相当于shape=(1,2),不是(1,2) 如:np1=np.arange(1,10).reshape(3,3),统计函数np1.sum(0)和np1.sum(1)的shape相同,都是(3,)。注意:(3,)是一维,(1,3)是二维
2.可以将一个标量赋值给numpy对象的切片,该标量会自动广播,而对list无法进行此操作
import numpy as np
np1=np.arange(1,10).reshape(3,3)
np1
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
np1[1,:]=0 #取第二行 注意np1[:3]是取前三行
np1
array([[1, 2, 3],
[0, 0, 0],
[7, 8, 9]])
# 对list切片不能赋值
l=[1,2,3]
l[:2]=0
Traceback (most recent call last):
File "", line 1, in
TypeError: can only assign an iterable
3.将numpy数组的切片赋值给一个变量,对新变量的任何操作会改变原始数组的值,因为数组切片是原始数组的视图,并不会复制。这一点与列表list 不同,list切片是浅复制,父对象复制了,子对象没有
np1=np.arange(1,10).reshape(3,3)
np1
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
np2=np1[0] #np2是由np1切片而来
np2
array([1, 2, 3])
np2[0]=100 #修改np2的值
np2
array([100, 2, 3])
np1 #np1也发生了变化
array([[100, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9]])
#深复制 np3=np1.copy() 改变np3的值不会影响np1
#list对象不同
l1=[1,2,3,[4,5]]
l2=l1[:] #切片复制
l2
[1, 2, 3, [4, 5]]
l2[0]=100
l2
[100, 2, 3, [4, 5]] #l2改变了
l1
[1, 2, 3, [4, 5]] #l1不变
l2[3][0]=200 #改变子对象
l2
[100, 2, 3, [200, 5]]
l1
[1, 2, 3, [200, 5]] #l1也发生变化了,因为list切片复制只复制了父对象,
#子对象没有复制,改变赋值后变量的子对象,原变量也会发生变化
4.对numpy数组切片是,没有,就表示对0轴进行操作,无论是普通切片还是bool型切片 np1(2,)等价于np1(2,:) np1(bob='zzz')等价于np1(bob='zzz',:) 该bool型数组的长度必须和轴长度相同,此时是0轴
5.numpy的转置是原数组的视图而并不是复制
6.np.where()三元表达式的用法
7.np.sum(a,0)=a.sum(0)
8.布尔型数组的用法:[np1>0]返回一个布尔型数组 np1[np1>0]=2 把np1中大于0的数替换成2(np1发生改变),还有一个用法是统计数量,如(np1>0).sum()表示np1中大于0的数字个数
9.排序时,np.sort(np1,0)返回的是副本(复制了),np1.sort(0)会改变数组np1本身
10.(若np1.ndim>=2,则)len(np1)返回第一个维度的长度
11.唯一化(无重复项),np.unique(np1)返回np1中的唯一值,且已经排序,是一维的,shape=(n,)
x=np.arange(0,10,2)
x
array([0, 2, 4, 6, 8])
np2,np1=np.meshgrid(x,x)
np1
array([[0, 0, 0, 0, 0],
[2, 2, 2, 2, 2],
[4, 4, 4, 4, 4],
[6, 6, 6, 6, 6],
[8, 8, 8, 8, 8]])
np2
array([[0, 2, 4, 6, 8],
[0, 2, 4, 6, 8],
[0, 2, 4, 6, 8],
[0, 2, 4, 6, 8],
[0, 2, 4, 6, 8]])
np.unique(np1)
array([0, 2, 4, 6, 8])
np.unique(np1).shape
(5,)
12.转化数据类型,np1.astype(np.int) 此时产生了副本 改变np1的数据类型应使用np1=np1.astype(np.int)