numpy.ndarray
numpy.array([1,2,3,4,5])
> array([1,2,3,4,5])
type(numpy.array([1,2,3,4])
> numpy.ndarray
dtype
属性以及astype()
方法data.dtype # dtype获取数组中的元素的类型
> dtype('int32')
new_data=data.astype(np.float) # 数组中的元素的类型必须一样,不同于list,有时我们需要修改一个数组中的元素的类型,使用astype()来修改
a=np.array([1,2,3])
b=np.array([1.,2.,3.,4.]) # 1. 1.0两个其实是一样的,前者简写了而已
c=np.array([1.0,2.0,3.0,4.0])
a.dtype,b.dtype,c.dtype
> (dtype('int32'), dtype('float64'), dtype('float64'))
shape
属性,得到的是一个元组data.shape
> (3,)
# (3,)是一维的维度,表示横向的3个元素
# (1,8)是二维的维度,表示1行8列
size
,获取ndarray的维度使用属性ndim
numpy.array([1,2,3,4])
numpy.array([1,2,3,4],dtype=np.float) # dtype参数控制ndarray中的数据类型
dc = numpy.array([1,2,3,4,5,6,7,8],ndim=2) # ndim参数控制这个ndarray的维度
dc.shape
> (1,8)
numpy.array([[1,2,3,4],[2,3,4,5],[3,4,5,6]]) # 传入一个嵌套列表,就得到一个多维数组
# numpy有专门的函数创建具有某些特征的ndarray
numpy.zeros((3,10)) # 参数是一个shape描述该ndarray的形状传入一个元组
> array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])
da=numpy.array([[1,2,3,4],[2,3,4,5],[3,4,5,6]])
# ...like这个方法创建数组,其参数就是一个数组,其会根据传入数组的shape来创建同shape的全0数组
numpy.zeros_like(da) # 创建一个3行4列的全0数组
numpy.ones()
和numpy.empty()
,他们同样有…like函数# 创建对角线ndarray即主对角线为1的单位矩阵
np.eye(4,dtype=int)
> array([[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]])
np.eye(4,dtype=int,k=1) # 只能创建2维数组,且是正方形的,k代表偏移
> array([[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1],
[0, 0, 0, 0]])
np.eye(4,dtype=int,k=-1)
> array([[0, 0, 0, 0],
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0]])
np.identity(4) # 此方法只能创建无偏移的单位矩阵
> array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
np.diag([1,2,3,4,5]) # 该方法功能更多,能指定对角线元素,自己确定方阵大小
> array([[1, 0, 0, 0, 0],
[0, 2, 0, 0, 0],
[0, 0, 3, 0, 0],
[0, 0, 0, 4, 0],
[0, 0, 0, 0, 5]])
np.diag([1,2,3,4,5,],k=2) # 还可以偏移
> array([[0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 2, 0, 0, 0],
[0, 0, 0, 0, 3, 0, 0],
[0, 0, 0, 0, 0, 4, 0],
[0, 0, 0, 0, 0, 0, 5],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0]])
de=np.arange(16).reshape((4,4))
> array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
np.diag(de) # 可以获取de这个数组中对角线的数组
> array([ 0, 5, 10, 15])
np.diag(de,k=-1) # 获取偏移-1对象线值的数组
> array([ 4, 9, 14])
# 等差
np.arange(1,100,3) # 根据步长创建,且是左闭右开;参数意义创建1到99的步长为3的数组
> array([ 1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49,
52, 55, 58, 61, 64, 67, 70, 73, 76, 79, 82, 85, 88, 91, 94, 97])
# 等比
np.linspace(1,10,5) # 根据数量创建,左闭右闭;参数意义创建1到10的5个等比例的数组
> array([ 1. , 3.25, 5.5 , 7.75, 10. ])
# np.dtype({'names':[],'formats':[]})自定义数组类型的写法,names的value指每一个元素中的名称,formats指每一个元素的数据类型
my_type=np.dtype({'names':['book','version'],'formats':['S40',np.int]}) # 自定义一个ndarray的类型为my_type
my_books=np.array([('learn java',1),('learn python',3),('learn C++',2)],dtype=my_type)
my_books.dtype
> dtype([('book', 'S40'), ('version', ')])
my_books[1] # 根据索引获取一个元素
> (b'learn python', 3)
my_books['book'] # 根据类型中的name获取所有该name的元素组成的数组
> array([b'learn java', b'learn python', b'learn C++'], dtype='|S40')
my_books[1]['book'] # 混合索引与name,先获取一个索引对应的元素,后获取其name
> b'learn python'
my_books['book'][1] # 先获取所有book name组成的数组,再按索引
> b'learn python'
my_books['book'][1]='this is changed' # 可通过索引修改指定元素,但不能新增
def foo(x):
return x*2
np.fromfunction(foo,(5,)) # 该方法根据方法创建ndarray,第二个参数表示维度,方法的参数个数与ndarray的维度对应
> array([0., 2., 4., 6., 8.])
np.fromfunction(lambda i,j:(i+1)*(j+1),(5,5),dtype=np.int) # 可以使用lambda简化一个函数
> array([[ 1, 2, 3, 4, 5],
[ 2, 4, 6, 8, 10],
[ 3, 6, 9, 12, 15],
[ 4, 8, 12, 16, 20],
[ 5, 10, 15, 20, 25]])
a[1][1][1]
> 17
a[1,1,1]
> 17
a[(1,1,1)]
> 17
# 上述索引操作相互等价
c[[0,1]] == c[0],c[1] # 下标是列表相当于组合其他元素
c[[0,2],[1,2]] == c[0,1],c[2,2] # 下标是多个list,每个list是从其对应的维度上取该维度的数组最后再组合
c=np.logspace(1,3,12).reshape(3,4)
c
> array([[ 10. , 15.19911083, 23.101297 , 35.11191734],
[ 53.36699231, 81.11308308, 123.28467394, 187.38174229],
[ 284.80358684, 432.87612811, 657.93322466, 1000. ]])
c[[0,2],[1,2]] # 这个组合其实就是组合下面的,在0轴上的0,2元素中再分别取1,2元素
> array([ 15.19911083, 657.93322466])
c[0,1],c[2,2]
> (15.199110829529339, 657.9332246575682)
# 重复list索引取到多次同一值
c[[2,2,2]]
> array([[ 284.80358684, 432.87612811, 657.93322466, 1000. ],
[ 284.80358684, 432.87612811, 657.93322466, 1000. ],
[ 284.80358684, 432.87612811, 657.93322466, 1000. ]])
b=np.linspace(0,100,5)
b
> array([ 0., 25., 50., 75., 100.])
b[np.array([2,3,2,3,2,3])] # == b[[2,3,2,3,2,3]]
> array([50., 75., 50., 75., 50., 75.])
b==50 # 数组判断,判断里面每个元素,得到一个bool的元组
> array([False, False, True, False, False])
t=b==50
t
> array([False, False, True, False, False])
b[t] # 根据bool数组来判断并取到相应元素
> array([50.])
b[b>50] # 这样写更简洁
> array([ 75., 100.])
b==50
> array([False, False, True, False, False])
b%2==0
> array([ True, True, True, False, True])
e[np.array([0,1]),np.array([3,4])] # 多维ndarray的一对一取索引原则
# 等同于 e[[0,1],[3,4]]==e[0,3],e[1,4]
a=np.arange(10,20)
a
> array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
b=a[2:8]
b
> array([12, 13, 14, 15, 16, 17])
b[0]=1000 # 数组的切片与原数组共用内存空间,就是使用同一个视图
b
> array([1000, 13, 14, 15, 16, 17])
a # 公用一个视图
> array([ 10, 11, 1000, 13, 14, 15, 16, 17, 18, 19])
对于二维或者多维的数组切片,也是在一维的基础上进行,不过是在每个轴方向上实施,最终获得重叠区域
b
> array([[ 0, 1, 2, 3, 4, 5],
[10, 11, 12, 13, 14, 15],
[20, 21, 22, 23, 24, 25],
[30, 31, 32, 33, 34, 35],
[40, 41, 42, 43, 44, 45],
[50, 51, 52, 53, 54, 55]])
b[1:4] # 多维数组切片
> array([[10, 11, 12, 13, 14, 15],
[20, 21, 22, 23, 24, 25],
[30, 31, 32, 33, 34, 35]])
b[1:4,2:5] # 先切0轴,再切1轴
> array([[12, 13, 14],
[22, 23, 24],
[32, 33, 34]])
b[:,[0,3]] # 在0轴上切片取所有,在1轴上取0和3
> array([[ 0, 3],
[10, 13],
[20, 23],
[30, 33],
[40, 43],
[50, 53]])
b[[1,4],1:5:3]
> array([[11, 14],
[41, 44]])
a=np.arrange(10)
a.reshape((2,5)) # reshape中传入一个元组
> array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
# 或者使用np.reshape()
np.reshape(a,(2,5))
> array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
c=np.reshape(b,(-1,1)) # 这里-1是一个不存在的索引
# 其意义就是o轴自己判断元素数量
c
> array([[0],
[1],
[2],
[3],
[4],
[5],
[6],
[7],
[8],
[9]])
np.reshape(b,(10,))
> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.reshape(b,(1,10))
> array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
# 上面两个看似相同,实则不同,前者是变形为一个一维数组
# 后者变形为一个只有一行的二维数组
b.shape=(1,10)
b
> array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
# 这种方式与reshape()的区别在于reshape()会新生成一个ndarray
# 修改shape这种方式会直接改变原ndarray的shape而不是新生成一个
# 扁平化一个数组,就是生成一个一维数组
# flatten生成新的数组,不共用一个视图
p=b.flatten()
p
> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 还可以使用ravel实现生成一维数组
# 该方法生成的数组与原数组共用视图
p=b.ravel()
p[0]=99
print(p)
print(b)
> [99 1 2 3 4 5 6 7 8 9]
[[99 1 2 3 4]
[ 5 6 7 8 9]]
# 运算
lst=[1,20,28,37,18,56]
a=np.array(lst)
a*3
> array([ 3, 60, 84, 111, 54, 168])
a-10
> array([[-10, -9, -8, -7, -6],
[ -5, -4, -3, -2, -1]])
# 广播
# 满足广播条件的计算要求,两个数组的任意一个轴需要长度相同
a
> array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
m=np.arange(5)
m.shape,a.shape
> ((5,), (2, 5))
a+m
> array([[ 0, 2, 4, 6, 8],
[ 5, 7, 9, 11, 13]])
n=np.arange(1,3).reshape((-1,1))
a.shape,n.shape
> ((2, 5), (2, 1))
a+n
> array([[ 1, 2, 3, 4, 5],
[ 7, 8, 9, 10, 11]])
np.array([6,4,3]) > np.array([9,5,1]) # 需要比较的数组大小相同
# 然后比较里面的每一个元素,最后得到的是一个bool类型的数组
> array([False, False, True])
# Numpy中的与或非是
# logical_and,logical_or,logical_not,logical_xor
np.logical_or(np.array([True,False]),np.array([False,True]))
> array([ True, True])
np.any
只要参数中的数组有一个为True就是True,否则是Falsenp.all
只有参数数组中全部为True才返回True,否则是False