np.array()
- numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
- object 数组或嵌套的数列
- dtype 数组元素的数据类型,可选
- copy 对象是否需要复制,可选
- order 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
- subok 默认返回一个与基类类型一致的数组
- ndmin 指定生成数组的最小维度
a = np.array([1, 2, 3,4,5], ndmin = 2)
print (a)
"""
[[1 2 3 4 5]]
"""
shape和reshape
- shape用于查看数组维度
- reshape用于调整数组的维度
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print(a.shape)
"""
(2, 3)
"""
调整维度
b = a.reshape(3,2)
print(b)
"""
[[1 2]
[3 4]
[5 6]]
"""
print(b.shape)
"""
(3, 2)
"""
值得注意的是:reshape获取的不是原始数据的拷贝,和原始数组共享的同一内存地址。
b[0][0] = 10
print(b)
"""
[[10 2]
[ 3 4]
[ 5 6]]
"""
print(a)
"""
[[10 2 3]
[ 4 5 6]]
"""
修改数组的形状并返回
- numpy.resize(arr, shape)
a = np.array([[1,2,3],[4,5,6]])
print ('第一个数组:')
print (a)
print ('\n')
print ('第一个数组的形状:')
print (a.shape)
print ('\n')
b = np.resize(a, (3,2))
print ('第二个数组:')
print (b)
print ('\n')
print ('第二个数组的形状:')
print (b.shape)
print ('\n')
# 要注意 a 的第一行在 b 中重复出现,因为尺寸变大了
print ('修改第二个数组的大小:')
b = np.resize(a,(3,3))
print (b)
"""
第一个数组:
[[1 2 3]
[4 5 6]]
第一个数组的形状:
(2, 3)
第二个数组:
[[1 2]
[3 4]
[5 6]]
第二个数组的形状:
(3, 2)
修改第二个数组的大小:
[[1 2 3]
[4 5 6]
[1 2 3]]
"""
各种初始化
- 参数说明:shape 是创建数组的形状, dtype是数据类型, order 有'C'和'F'两个选项,表示行优先和列优先
- c = numpy.empty(shape, dytpe= float , order= 'C') 创建指定形状且未初始化的数组
- numpy.zeros(shape, dytpe= float , order= 'C')创建指定形状且初始化为0的数组
- numpy.ones(shape, dytpe= float , order= 'C')创建指定形状且初始化为1的数组
x = np.ones([3,2], dtype = int)
print(x)
"""
[[1 1]
[1 1]
[1 1]]
"""
np.arange()
- numpy.arange(start, stop, step, dtype)
- start 起始值,默认为0
- stop 终止值(不包含)
- step 步长,默认为1
- dtype 返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。
x = np.arange(5)
print (x)
"""
[0 1 2 3 4]
"""
x = np.arange(10,20,2)
print (x)
"""
[10 12 14 16 18]
"""
切片和索引
- 用python自带的slice()函数
a = np.arange(10)
s = slice(2,7,2) # 第一个参数是开始下标,第二个是结束下标,第三个是步长
print(a[s])
"""
[2 4 6]
"""
- numpy的切片
- 三个参数:第一个参数是开始下标,第二个是结束下标,第三个是步长
- 一个参数就是直接索引,两个参数就是python常用的列表切片。
b = a[2:7:2]
print(b)
"""
[2 4 6]
"""
- 切片还可以包括省略号 …,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray。
- 这个省略号就是表示该维度的数据需要全部取出来而已
a = np.array([[[1,2,3],[4,5,6],[7,8,9]]])
print(a.shape)
"""
(1, 3, 3)
"""
print(a[...,1]) # 前边的维度全部取,然后最后一个维度下标为1
"""
[[2 5 8]]
"""
print(a[0,...]) # 第一个维度的第0 维度,其他维度全部取
"""
[[1 2 3]
[4 5 6]
[7 8 9]]
"""
print(a[0,...,1]) # 第一个维度取0维,第二个维度全部取,最后一个维度下标为1
"""
[2 5 8]
"""
print(a[0,1])
"""
[4 5 6]
"""
切片操作
a = np.array([[1,2,3], [4,5,6],[7,8,9]])
print(a.shape)
"""
(3, 3)
"""
b = a[1:3, 1:3] # 第一个维度1-2,第二个维度1-2
"""
[[5 6]
[8 9]]
"""
c = a[1:3,[1,2]] #第一个维度1-2,第二个维度取下标1和下标2
"""
[[5 6]
[8 9]]
"""
d = a[...,1:] # 第一个维度全取,第二个维度1-全部
"""
[[2 3]
[5 6]
[8 9]]
"""
广播机制
-
一张图非常清楚
a = np.array([[ 0, 0, 0],
[10,10,10],
[20,20,20],
[30,30,30]])
b = np.array([1,2,3])
print(a + b)
"""
[[ 1 2 3]
[11 12 13]
[21 22 23]
[31 32 33]]
"""
转置、迭代和复制
- 转置就是a.T
- 迭代就是np.nditer(a)
b = a.T
for x in np.nditer(c): # 迭代方式1
print (x, end=", " )
for item in a.flat: # 迭代方式2
print(item)
c = b.copy(order='C')
c = b.copy(order='F')
转换维度np.transpose(a)
a = np.arange(12).reshape(3,4)
print(a)
print(np.transpose(a))
print(a.T)
"""
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[ 0 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
[[ 0 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
"""
升维和降维
- np.expand_dims(x, axis = 0)
- z = np.squeeze(y)
x = np.array(([1,2],[3,4]))
print(x)
print(x.shape)
print('******')
y = np.expand_dims(x, axis = 0)
print(y)
print(y.shape)
print('******')
z = np.squeeze(y)
print(z)
print(z.shape)
"""
[[1 2]
[3 4]]
(2, 2)
******
[[[1 2]
[3 4]]]
(1, 2, 2)
******
[[1 2]
[3 4]]
(2, 2)
"""
链接多个数组
- numpy.concatenate((a1, a2, ...), axis)
a = np.array([[1,2],[3,4]])
print ('第一个数组:')
print (a)
print ('\n')
b = np.array([[5,6],[7,8]])
print ('第二个数组:')
print (b)
print ('\n')
# 两个数组的维度相同
print ('沿轴 0 连接两个数组:')
print (np.concatenate((a,b)))
print ('\n')
print ('沿轴 1 连接两个数组:')
print (np.concatenate((a,b),axis = 1))
"""
第一个数组:
[[1 2]
[3 4]]
第二个数组:
[[5 6]
[7 8]]
沿轴 0 连接两个数组:
[[1 2]
[3 4]
[5 6]
[7 8]]
沿轴 1 连接两个数组:
[[1 2 5 6]
[3 4 7 8]]
"""
末尾插入
- numpy.append(arr, values, axis=None)
arr:输入数组
values:要向arr添加的值,需要和arr形状相同(除了要添加的轴)
axis:默认为 None。当axis无定义时,是横向加成,返回总是为一维数组!当axis有定义的时候,分别为0和1的时候。当axis有定义的时候,分别为0和1的时候(列数要相同)。当axis为1时,数组是加在右边(行数要相同)。
给定轴插入
- numpy.insert(arr, obj, values, axis)
arr:输入数组
obj:在其之前插入值的索引
values:要插入的值
axis:沿着它插入的轴,如果未提供,则输入数组会被展开
加减乘除
- NumPy 算术函数包含简单的加减乘除: add(),subtract(),multiply() 和 divide()。
- np.add(a,b)
numpy.vdot(a,b)
- 两个矩阵相乘等于一个数
numpy.matmul(a,b)
- 返回两个矩阵的乘积