指定数据类型
a = numpy.array(range(6), dtype=numpy.int8)
指定数据类型为int8
numpy数组的形状
使用方法(ipython3)
In [2]: import numpy
In [3]: numpy.arange(1,6)
Out[3]: array([1, 2, 3, 4, 5])
In [4]: numpy.array(range(1,6))
Out[4]: array([1, 2, 3, 4, 5])
In [5]: numpy.array([1,2,3,4,5])
Out[5]: array([1, 2, 3, 4, 5])
In [6]: a = numpy.arange(1,6)
In [7]: b = numpy.array(range(1,6))
In [8]: c = numpy.array([1,2,3,4,5])
In [9]: type(a)
Out[9]: numpy.ndarray
In [10]: type(b)
Out[10]: numpy.ndarray
In [11]: type(c)
Out[11]: numpy.ndarray
shape方法
In [6]: a = numpy.arange(1,6)
In [12]: a.shape
Out[12]: (5,)
In [15]: d = numpy.array([[1,2,3], [4,5,6]])
In [16]: d.shape
Out[16]: (2, 3)
In [17]: e = numpy.array([[1,2,3], [4,5,6],[7,8,9]])
In [18]: e.shape
Out[18]: (3, 3)
shape得到的元组中,几个元素代表几位数组。
reshape
把一个一行的数组变成一个3行四列的数组
In [23]: a
Out[23]: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
In [24]: a.reshape((3,4))
Out[24]:
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
reshape不会对数据本身进行修改,而是会返回重新组合的数组。
flatten
将多维数组展开
In [38]: a
Out[38]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
In [39]: a.flatten()
Out[39]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23])
numpy数组的计算
In [50]: a
Out[50]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
In [51]: a * 2
Out[51]:
array([[ 0, 2, 4, 6, 8, 10],
[12, 14, 16, 18, 20, 22],
[24, 26, 28, 30, 32, 34],
[36, 38, 40, 42, 44, 46]])
数组会对其中的所有元素做计算操作。
数组和数组的计算:
In [50]: a
Out[50]:
array([[ 0, 2, 4, 6, 8, 10],
[12, 14, 16, 18, 20, 22],
[24, 26, 28, 30, 32, 34],
[36, 38, 40, 42, 44, 46]])
In [54]: b
Out[54]:
array([[100, 101, 102, 103, 104, 105],
[106, 107, 108, 109, 110, 111],
[112, 113, 114, 115, 116, 117],
[118, 119, 120, 121, 122, 123]])
In [53]: a + b
Out[53]:
array([[100, 102, 104, 106, 108, 110],
[112, 114, 116, 118, 120, 122],
[124, 126, 128, 130, 132, 134],
[136, 138, 140, 142, 144, 146]])
对应位置的元素进行计算。
数组和形状不同的数组进行计算:
In [56]: c
Out[56]: array([0, 1, 2, 3, 4, 5])
In [57]: b - c
Out[57]:
array([[100, 100, 100, 100, 100, 100],
[106, 106, 106, 106, 106, 106],
[112, 112, 112, 112, 112, 112],
[118, 118, 118, 118, 118, 118]])
In [58]: d = numpy.arange(4).reshape((4,1))
In [59]: d
Out[59]:
array([[0],
[1],
[2],
[3]])
In [60]: b - d
Out[60]:
array([[100, 101, 102, 103, 104, 105],
[105, 106, 107, 108, 109, 110],
[110, 111, 112, 113, 114, 115],
[115, 116, 117, 118, 119, 120]])
当某一维度是相同的时候,他们是可以计算的。
通过不同形状的数组计算,我们可以计算每行或者每列元素对不同值加减的运算。
轴(axis)
一维数组:0轴(列)
二维数组:0轴、1轴(行、列)
三维数组:0轴、1轴、2轴(块、行、列)
numpy读取数据
一般不用。
np.loadtxt(fname, dtype=float, comments='#', delimiter=None,
converters=None, skiprows=0, usecols=None, unpack=False,
ndmin=0, encoding='bytes')
参数 | 解释 |
---|---|
fname | 文件、字符串或产生器,可以使.gz或bz2压缩文件 |
dtype | 数据类型、可选,CSV的字符串以什么数据类型读入数组中,默认np.float |
delimiter | 分割字符串,默认是任何空格,改为逗号 |
skiprows | 调过前x行,一般跳过第一行表头 |
usecols | 读取指定的列,索引,元组类型 |
unpack | 如果True,读入属性将分别写入不同的数组变量,False读入数据只写入一个数组变量,默认False(转置,对角线旋转180°) |
转置
In [65]: b
Out[65]:
array([[100, 101, 102, 103, 104, 105],
[106, 107, 108, 109, 110, 111],
[112, 113, 114, 115, 116, 117],
[118, 119, 120, 121, 122, 123]])
In [66]: b.T
Out[66]:
array([[100, 106, 112, 118],
[101, 107, 113, 119],
[102, 108, 114, 120],
[103, 109, 115, 121],
[104, 110, 116, 122],
[105, 111, 117, 123]])
行变列,列变行,沿对角线旋转180°即是结果。
numpy索引和切片
import numpy as np
uk_file_path = "./youtube_video_data/US_video_data_numbers.csv"
t2 = np.loadtxt(fname=uk_file_path,dtype='int',delimiter=',')
print(t2)
print('*' * 100)
# 取第二行
print(t2[2])
# 取第二行开始后面的每一行
print("*" * 100)
print(t2[2:])
# 取第2、4、8行
print("*" * 100)
print(t2[[2,4,8]])
# 取列
print("*" * 100)
print(t2[:,0])
# 取第二列开始后面的每一列
print("*" * 100)
print(t2[:,2:])
# 取第0、2列
print("*" * 100)
print(t2[:,[0,2]])
# 取1-3行,2-4列交集的数组
print("*" * 100)
print(t2[0:3,1:4])
# 取多个不相邻的点
# 选出来的结果是(0,0)和(2,1)即行列对应点
print("*" * 100)
print(t2[[0,2],[0,1]])
numpy数值的修改
如,获取b中大于105的值:
In [67]: b
Out[67]:
array([[100, 101, 102, 103, 104, 105],
[106, 107, 108, 109, 110, 111],
[112, 113, 114, 115, 116, 117],
[118, 119, 120, 121, 122, 123]])
In [68]: b > 105
Out[68]:
array([[False, False, False, False, False, False],
[ True, True, True, True, True, True],
[ True, True, True, True, True, True],
[ True, True, True, True, True, True]])
In [69]: b[b>105]
Out[69]:
array([106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,
119, 120, 121, 122, 123])
将大于110的值变成110
In [70]: b[b>110] = 110
In [71]: b
Out[71]:
array([[100, 101, 102, 103, 104, 105],
[106, 107, 108, 109, 110, 110],
[110, 110, 110, 110, 110, 110],
[110, 110, 110, 110, 110, 110]])
使用where
np.where(t<10,0,10)
使用clip
t.clip(10,18)
把小于10的替换成10,大于18的替换成18
astype
改变数组的数值类型
In [72]: b.astype(float)
Out[72]:
array([[100., 101., 102., 103., 104., 105.],
[106., 107., 108., 109., 110., 110.],
[110., 110., 110., 110., 110., 110.],
[110., 110., 110., 110., 110., 110.]])
In [74]: b = b.astype(float)
In [75]: b[1,3] = numpy.nan
In [76]: b
Out[76]:
array([[100., 101., 102., 103., 104., 105.],
[106., 107., 108., nan, 110., 110.],
[110., 110., 110., 110., 110., 110.],
[110., 110., 110., 110., 110., 110.]])
数组的拼接
np.vstack((t1,t2)) 竖直拼接
np.hstack((t1,t2)) 水平拼接
数组的行列交换
In [86]: c
Out[86]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23],
[ 4, 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 15],
[16, 17, 18, 19, 20, 21],
[22, 23, 24, 25, 26, 27]])
In [87]: c[[1,4],:] = c[[4,1],:]
In [88]: c
Out[88]:
array([[ 0, 1, 2, 3, 4, 5],
[ 4, 5, 6, 7, 8, 9],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23],
[ 6, 7, 8, 9, 10, 11],
[10, 11, 12, 13, 14, 15],
[16, 17, 18, 19, 20, 21],
[22, 23, 24, 25, 26, 27]])
创建一个全部为0的数组
np.zeros((3,4))
创建一个全部为1的数组
np.ones((3,4))
创建一个对角线为1的数组(参数是行列数)
np.eye(3)
获取最大值最小值的位置
In [94]: a
Out[94]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
In [95]: b
Out[95]:
array([[ 4, 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 15],
[16, 17, 18, 19, 20, 21],
[22, 23, 24, 25, 26, 27]])
In [96]: numpy.argmax(a, axis=0)
Out[96]: array([3, 3, 3, 3, 3, 3])
In [97]: numpy.argmin(a, axis=0)
Out[97]: array([0, 0, 0, 0, 0, 0])
In [98]: a
Out[98]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
In [99]: numpy.argmin(a, axis=1)
Out[99]: array([0, 0, 0, 0])
In [100]: numpy.argmax(a, axis=1)
Out[100]: array([5, 5, 5, 5])
axis = 0 表示取出每一列最大值的位置,即结果,每一列最大值的位置在第3行
axis = 1 表示取出每一行最大值的位置,即结果,每一行最大值的位置在第5列
numpy的随机数
参数 | 解释 |
---|---|
.rand(d0,d1,...dn) | 创建d0-dn维度的均匀分布的随机数数组,浮点数,范围从0-1 |
.randn(d0,d1,...dn) | 创建一个d0-dn维度的标准正态分布随机数,浮点数,平均数0,标准差1 |
.randint(low,high,(shape)) | 从给定上下线范围选取随机数整数,范围是low,high,形状是shape |
.uniform(low,high,(size)) | 产生具有均匀分布的数组,low起始值,high结束值,size形状 |
.normal(loc,scale,(size)) | 从指定正态分布中随机抽取样本,分布中心是loc,概率分布的均值,标准差是scale,形状是size |
.seed(s) | 随机数种子,s是种子值,只要给定的S相同,每次生成的都是相同的随机数 |
numpy中的nan和inf
nan(NAN,Nan): not a number 表示不是一个数字
inf(-inf\inf):infinity,inf表示正无穷,-inf表示负无穷
两者都是浮点类型
判断数组中NAN的个数:
首先要用到一个方法
numpy.count_nonzero()
统计数组中非零元素的个数
然后我们先获取到一个新的数组:a!=a
当a数组如下时:
In [110]: a
Out[110]:
array([[ 0., 1., 2., 3., 4., 5.],
[ 6., 7., 8., 9., 10., 11.],
[12., 13., 14., 15., nan, 17.],
[18., 19., 20., 21., 22., 23.]])
其中有一个NAN,但是nan总是不相等的,即numpy.nan != numpy.nan
所有,我们利用a!=a,可以得到一个bool类型数组,相同的为False,不相同的为True
In [109]: a != a
Out[109]:
array([[False, False, False, False, False, False],
[False, False, False, False, False, False],
[False, False, False, False, True, False],
[False, False, False, False, False, False]])
False = 0,True = 1
所以:
In [111]: numpy.count_nonzero(a!=a)
Out[111]: 1
显示出,数组中有一个NAN元素。
a!=a还可以用另一种方式得到:
In [112]: numpy.isnan(a)
Out[112]:
array([[False, False, False, False, False, False],
[False, False, False, False, False, False],
[False, False, False, False, True, False],
[False, False, False, False, False, False]])
一般在数组中有NAN的时候,我们一般替换NAN的值为中值或者均值。
numpy中常用额的函数
函数名称 | 作用 |
---|---|
t.sum(axis=None) | 求和 |
t.mean(axis=None) | 均值 |
np.median(t,axis=None) | 中值 |
t.max(axis=None) | 最大值 |
t.min(axis=None) | 最小值 |
np.ptp(axis=None) | 极值,最大值和最小值之差 |
t.std(axis=None) | 标准差,反应数值波动大小的程度 |