NumPy 最重要的一个特点是其 N 维数组对象 ndarray。
np中的array()函数用于创建数组对象ndarray:
numpy.array(object,dtype=None,copy=True,order=None,subok=False,ndmin=0)
参数说明:
名称描述
object
数组或嵌套的数列
dtype
数组元素的数据类型,可选
copy
对象是否需要复制,可选
order
创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
subok
默认返回一个与基类类型一致的数组
ndmin
指定生成数组的最小维度
1 >>> a = array([[1,2,3]],dtype = str) #dtype属性用于指定数组中元素的数据类型
2 >>>a3 array([['1', '2', '3']], dtype='
1 >>> a = array([1,2,3],ndmin = 3) #ndmin指定数组的维度,
2 >>>a3 array([[[1, 2, 3]]])4 >>> a.shape #ndmin指定数组为3维的数组
5 (1, 1, 3)
数据类型对象
dtype对象用于构造数据类型,dtype 对象是使用以下语法构造的:
numpy.dtype(object,align,copy)
object - 要转换为的数据类型对象
align - 如果为 true,填充字段使其类似 C 的结构体。
copy - 复制 dtype 对象 ,如果为 false,则是对内置数据类型对象的引用
1 >>> dt = dtype([('age',int8)]) #自建结构化的数据类型
2 >>>dt3 dtype([('age', 'i1')])#
1 >>> student = dtype([('name','S20'),('age','i1'),('marks','f4')]) #创建学生数据类型
2 >>>student3 dtype([('name', 'S20'), ('age', 'i1'), ('marks', '>> a = array([[('louis',3,2.0),('bob',1,1.0)],[('mary',2,2.0),('jeff',8,8.0)]])5 >>>a6 array([[['louis', '3', '2.0'],7 ['bob', '1', '1.0']],8
9 [['mary', '2', '2.0'],10 ['jeff', '8', '8.0']]], dtype='>>a.shape12 (2, 2, 3)
numpy数组属性
属性说明
ndarray.ndim
秩,即轴的数量或维度的数量
ndarray.shape
数组的维度,对于矩阵,n 行 m 列
ndarray.size
数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtype
ndarray 对象的元素类型
ndarray.itemsize
ndarray 对象中每个元素的大小,以字节为单位
ndarray.flags
ndarray 对象的内存信息
ndarray.real
ndarray元素的实部
ndarray.imag
ndarray 元素的虚部
ndarray.data
包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。
1 >>> b = arange(9) #arange()函数创建一个一维数组
2 >>>b3 array([0, 1, 2, 3, 4, 5, 6, 7, 8])4 >>> c = b.reshape(1,3,3) #reshape()重新指定数组的维度
5 >>>c6 array([[[0, 1, 2],7 [3, 4, 5],8 [6, 7, 8]]])9 >>> c.shape #shape属性指定数组维度
10 (1, 3, 3)11 >>> c.ndim #ndim属性指定数组维数
12 3
创建数组的三个函数
numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组:
numpy.empty(shape,dtype =float,order ='C')
参数描述
shape
数组形状
dtype
数据类型,可选
order
有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。
>>> d = empty((3,3),dtype =float)>>>d
array([[2.94873482e-300, -1.51146234e-311, 2.92109692e-300],
[9.79258397e-292, 2.92138172e-300, 4.86951257e-300],
[5.62191079e-300, 5.55218946e-300, 2.43312694e-290]])#empty()函数生成的数组的元素是随机的,因为他们并没有初始化
numpy.zeros
创建指定大小的数组,数组元素以 0 来填充:
numpy.zeros(shape,dtype =float,order ='C')
参数说明:
参数描述
shape
数组形状
dtype
数据类型,可选
order
'C' 用于 C 的行数组,或者 'F' 用于 FORTRAN 的列数组
1 >>> d = zeros((3,3),dtype =int)2 >>>d3 array([[0, 0, 0],4 [0, 0, 0],5 [0, 0, 0]])
numpy.ones
创建指定形状的数组,数组元素以 1 来填充:
numpy.ones(shape,dtype =None,order ='C')
参数说明:
参数描述
shape
数组形状
dtype
数据类型,可选
order
'C' 用于 C 的行数组,或者 'F' 用于 FORTRAN 的列数组
1 >>> d = ones((3,3),dtype =int)2 >>>d3 array([[1, 1, 1],4 [1, 1, 1],5 [1, 1, 1]])
从已有数组创建数组
numpy.asarray
numpy.asarray 类似 numpy.array,但 numpy.asarray 参数只有三个,比 numpy.array 少两个。
numpy.asarray(a,dtype =None,order =None)
参数说明:
参数描述
a
任意形式的输入参数,可以是,列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组
dtype
数据类型,可选
order
可选,有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。
>>> a = zeros((1,3)) #创建一个数据类型为float的数组
>>>a
array([[0., 0., 0.]])>>> e = ['你好','再见','滚蛋'] #>>>e
['你好', '再见', '滚蛋']>>> a[0,:] = e[:] #如果用索引和切片将字符串列表赋值给数组将会发生异常
Traceback (most recent call last):
File"", line 1, in a[0,:]=e[:]
ValueError: couldnot convert string to float: '你好'
>>> a = asarray(e) #通过asarray(e)函数可以将不同数据类型的元素赋值给数组
>>>a
array(['你好', '再见', '滚蛋'], dtype='
numpy.fromiter
numpy.fromiter 方法从可迭代对象中建立 ndarray 对象,返回一维数组。
numpy.fromiter(iterable,dtype,count=-1)
参数描述
iterable
可迭代对象
dtype
返回数组的数据类型
count
读取的数据数量,默认为-1,读取所有数据
1 >>> f = [1,2,3]2 >>>f3 [1, 2, 3]4 >>>b5 array([0, 1, 2, 3, 4, 5, 6, 7, 8])6 >>> b = fromiter(f,dtype=int)7 >>>b8 array([1, 2, 3])9 >>> b = fromiter(f,dtype=int,count=2)10 >>>b11 array([1, 2])
从数值范围创建数组
numpy.arange
numpy 包中的使用 arange 函数创建数值范围并返回 ndarray 对象,函数格式如下:
numpy.arange(start,stop,step,dtype)
根据 start 与 stop 指定的范围以及 step 设定的步长,生成一个 ndarray。
参数说明:
参数描述
start
起始值,默认为0
stop
终止值(不包含)
step
步长,默认为1
dtype
返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。
>>> a = arange(3,9,2) #从3-9之间生成元素,元素之间相差2
>>>a
array([3, 5, 7])
numpy.linspace
numpy.linspace 函数用于创建一个一维数组,数组是一个等差数列构成的,格式如下:
np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)
参数说明:
参数描述
start
序列的起始值
stop
序列的终止值,如果endpoint为true,该值包含于数列中
num
要生成的等步长的样本数量,默认为50
endpoint
该值为 true 时,数列中包含stop值,反之不包含,默认是True。
retstep
如果为 True 时,生成的数组中会显示间距,反之不显示。
dtype
ndarray 的数据类型
1 >>> a = linspace(0,49)2 >>>a3 array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12.,4 13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24., 25.,5 26., 27., 28., 29., 30., 31., 32., 33., 34., 35., 36., 37., 38.,6 39., 40., 41., 42., 43., 44., 45., 46., 47., 48., 49.])7 >>> a = linspace(0,51,retstep=True)8 >>>a9 (array([ 0. , 1.04081633, 2.08163265, 3.12244898, 4.16326531,10 5.20408163, 6.24489796, 7.28571429, 8.32653061, 9.36734694,11 10.40816327, 11.44897959, 12.48979592, 13.53061224, 14.57142857,12 15.6122449 , 16.65306122, 17.69387755, 18.73469388, 19.7755102,13 20.81632653, 21.85714286, 22.89795918, 23.93877551, 24.97959184,14 26.02040816, 27.06122449, 28.10204082, 29.14285714, 30.18367347,15 31.2244898 , 32.26530612, 33.30612245, 34.34693878, 35.3877551,16 36.42857143, 37.46938776, 38.51020408, 39.55102041, 40.59183673,17 41.63265306, 42.67346939, 43.71428571, 44.75510204, 45.79591837,18 46.83673469, 47.87755102, 48.91836735, 49.95918367, 51. ]), 1.0408163265306123)
numpy.logspace
numpy.logspace 函数用于创建一个于等比数列。格式如下:
np.logspace(start,stop,num=50,endpoint=True,base=10.0,dtype=None)
base 参数意思是取对数的时候 log 的下标。
参数描述
start
序列的起始值为:base ** start
stop
序列的终止值为:base ** stop。如果endpoint为true,该值包含于数列中
num
要生成的等步长的样本数量,默认为50
endpoint
该值为 true 时,数列中中包含stop值,反之不包含,默认是True。
base
对数 log 的底数。
dtype
ndarray 的数据类型
1 >>> a = logspace(2,6,base = 2,num = 2)2 >>>a3 array([ 4., 64.])
numpy切片和索引
1 >>> a = array([[1,2,3],[3,4,5],[4,5,6]])2 >>>a3 array([[1, 2, 3],4 [3, 4, 5],5 [4, 5, 6]])6 >>> a[,1]7 SyntaxError: invalid syntax8 >>> a[...,1] #从每一行中选择第二个元素9 array([2, 4, 5])10 >>> a[1,...]11 array([3, 4, 5]) #选择第二行的所有元素12 >>> a[...,1:] #从每一行选择第二个之后的所有元素13 array([[2, 3],14 [4, 5],15 [5, 6]])16 >>> a[2][2]17 6#
布尔索引
>>> a = array([[1,2,3],[3,4,5],[4,5,6]])>>>a
array([[1, 2, 3],
[3, 4, 5],
[4, 5, 6]])>>> a[a>3] #选择数组中大于3的元素,返回一维数组
array([4, 5, 4, 5, 6])
numpy广播broadcast
如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。
1 >>> b = array([3,2,1])2 >>>b3 array([3, 2, 1])4 >>> b1 = array([1,2,3])5 >>> b +b16 array([4, 4, 4])
当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制。
1 >>> a +b12 array([[2, 4, 6],3 [4, 6, 8],4 [5, 7, 9]])
numpy迭代数组
>>>a
array([[1, 2, 3],
[3, 4, 5],
[4, 5, 6]])>>> for x in nditer(a,order='F'): #按列访问
print(x,end=' ')1 3 4 2 4 5 3 5 6
>>> for x in nditer(a,order='C'): #按行访问,默认按行访问
print(x,end=' ')1 2 3 3 4 5 4 5 6
>>> for x in nditer(a.T): #a的转置矩阵,访问顺序和a一样,说明他在内存中存储顺序和a一样
print(x,end=' ')1 2 3 3 4 5 4 5 6
修改数组元素中的值
nditer 对象有另一个可选参数 op_flags。 默认情况下,nditer 将视待迭代遍历的数组为只读对象(read-only),为了在遍历数组的同时,实现对数组元素值得修改,必须指定 read-write 或者 write-only 的模式。
>>>a
array([[1, 2, 3],
[3, 4, 5],
[4, 5, 6]])>>> for x in nditer(a.T): #这种方式只是修改了迭代的值,但是并没有改变原数组
x = x+1
print(x,end=' ')2 3 4 4 5 6 5 6 7
>>>a
array([[1, 2, 3],
[3, 4, 5],
[4, 5, 6]])>>> for x in nditer(a.T,op_flags=['readwrite']): #数组元素同时也改变了
x[...] = x + 1
print(x,end=' ')2 3 4 4 5 6 5 6 7
>>>a
array([[2, 3, 4],
[4, 5, 6],
[5, 6, 7]])
nditer类的构造器拥有flags参数,它可以接受下列值:
参数描述
c_index
可以跟踪 C 顺序的索引
f_index
可以跟踪 Fortran 顺序的索引
multi-index
每次迭代可以跟踪一种索引类型
external_loop
给出的值是具有多个值的一维数组,而不是零维数组
如果直接使用数组名做迭代对象,则每次访问的是“一行”
1 >>> for i ina:2 print(i)3
4
5 [2 3 4]6 [4 5 6]7 [5 6 7]
广播迭代
如果两个数组是可广播的,nditer 组合对象能够同时迭代它们。 假设数组 a 的维度为 3X4,数组 b 的维度为 1X4 ,则使用以下迭代器(数组 b 被广播到 a 的大小)。
importnumpy as np
a= np.arange(0,60,5)
a= a.reshape(3,4)print ('第一个数组为:')print(a)print ('\n')print ('第二个数组为:')
b= np.array([1, 2, 3, 4], dtype =int)print(b)print ('\n')print ('修改后的数组为:')for x,y innp.nditer([a,b]):print ("%d:%d" % (x,y), end=",")
第一个数组为:
[[ 05 10 15]
[20 25 30 35]
[40 45 50 55]]
第二个数组为:
[1 2 3 4]
修改后的数组为:
0:1, 5:2, 10:3, 15:4, 20:1, 25:2, 30:3, 35:4, 40:1, 45:2, 50:3, 55:4,
numpy数组操作
修改数组形状
numpy.reshape
numpy.reshape 函数可以在不改变数据的条件下修改形状,格式如下: numpy.reshape(arr, newshape, order='C')
arr:要修改形状的数组
newshape:整数或者整数数组,新的形状应当兼容原有形状
order:'C' -- 按行,'F' -- 按列,'A' -- 原顺序,'k' -- 元素在内存中的出现顺序
1 >>>b2 array([[2, 3, 4],3 [4, 5, 6],4 [5, 6, 7]])5 >>>b.shape6 (3, 3)7 >>> b.reshape((1,9)) #重塑数组维度为1,9
8 array([[2, 3, 4, 4, 5, 6, 5, 6, 7]])9 >>>b.shape10 (1,9)
numpy字符串操作
函数描述
add()
对两个数组的逐个字符串元素进行连接
multiply()
返回按元素多重连接后的字符串
center()
居中字符串
capitalize()
将字符串第一个字母转换为大写
title()
将字符串的每个单词的第一个字母转换为大写
lower()
数组元素转换为小写
upper()
数组元素转换为大写
split()
指定分隔符对字符串进行分割,并返回数组列表
splitlines()
返回元素中的行列表,以换行符分割
strip()
移除元素开头或者结尾处的特定字符
join()
通过指定分隔符来连接数组中的元素
replace()
使用新字符串替换字符串中的所有子字符串
decode()
数组元素依次调用str.decode
encode()
数组元素依次调用str.encode
numpy.char.add()
numpy.char.add() 函数依次对两个数组的元素进行字符串连接。
>>>s1
array(['a', 'b', 'c'], dtype='>> s2 =s1>>>s2
array(['a', 'b', 'c'], dtype='>>char.add(s1,s2)
array(['aa', 'bb', 'cc'], dtype='>> s3 =char.add(s1,s2)>>>s3
array(['aa', 'bb', 'cc'], dtype='>>char.add(s3,s3)
array(['aaaa', 'bbbb', 'cccc'], dtype='>> s4 = tile(s1,(3,1))>>>s4
array([['a', 'b', 'c'],
['a', 'b', 'c'],
['a', 'b', 'c']], dtype='>> char.add(s1,s4) #数组字符串连接的时候适用广播准则
array([['aa', 'bb', 'cc'],
['aa', 'bb', 'cc'],
['aa', 'bb', 'cc']], dtype='
numpy.char.multiply()
numpy.char.multiply() 函数执行多重连接。
1 >>>s12 array(['a', 'b', 'c'], dtype='>> char.multiply(s1,3)4 array(['aaa', 'bbb', 'ccc'], dtype='