通过字符串参数来指定
np. zeros(10,dtype="int16")
通过numpy对象来指定
no. zeros(10,dtype=no.int16)
属性:
数组的纬度,ar. ndim
数组每个纬度的大小,ar. shape
数组的总大小,ar. size
数组的类型,at.dtype
数组每个元素字节大小,at. itemsize
数组总字节大小,at. nbytes,等于上两个乘积
numpy数组是固定类型的,如果将一个浮点型值插入一个整型数组时,浮点值会被截断成整型。不会有警告。
数组切片:获取子数组slice
获取数组内单个元素的方法:ar[1]
用切片来获取子数组,与python切片语法一样
x[start,stop,step] 默认值为[0,整个size,1]
多维数组:[行,列]行列就是一维数组的方式
获取数组,单行单列的方法
列ar[:,1]行ar[1,:],行可以省略为ar[1]
另:切片返回的是,数组数据的,视图。而不是数值数据的副本。视图的意思,就是就算你把切片结果的子数组赋值给一个变量了,但是这个变量指向还是原来的数据,修改这个变量,原始数据也会被修改。
创建副本,就用ar. copy(),这时,修改子数组,就不会把原数据更改掉。
ar. reshape((x,y))返回的也是非副本视图,指向同一组数据。
解释:二维数组里面,[1,1]的话,就是,最外层index为1的数组,然后,在这个数组内再选择index为1的元素。[1,:1]就是在被选择后的数组内,就行切片,切片是从0开始,前闭后开,切出来的是index为0的元素形成的新数组。也就是说没有:的时候,选择的是元素,有:的时候,切出来的是一个子数组。
如果只是修改元素值,不用切片,直接用元素的索引。本图片用的是1比较特殊。所以会出现好像都选的是元素的错觉。
将一个一纬数组变形为,二维的行或者列的矩阵。
从上图可以看到,二维数组,就是一个矩阵。特别是从转换成列矩阵的时候,加了逗号。
数组的分裂
x=[1,2,3,99,99,3,2,1]
x1,x2,x3=np. split(x,[3,5])
切片都不包含后面的
slice 切成片 split使分解
雷同vsplit和hsplit
Numpy数组计算:通用函数
使Numpy变快的关键是利用向量化操作。
用seed(x)x可以为0到任何整数,设置np. random. seed(x)以后,下面每一次执行随机生成的值都是一样,并且x设置为任何数,得到随机生成的值都是一样的。参看seed(0)和seed(500)的结果。
另外我想这样设置的目的是:在生成一笔数据的时候,我们可以用randint()这个函数,不用手打,此时我们得到的是随机产生的一组数据。
设置seed()之后呢,这个随机产生的数据相当于固定了。这样如果后面的程序要验证同一组数据的一些结果,就可以直接拿来用。每次导进来的数据都是一样的,且这组数据是随机产生的。
empty()创建的是没有意义的空置。生成的值是随机的。
测试代码运行时间,%timeit 代码
NumPy通用函数
通用函数有两种存在形式:一元通用函数,二元通用函数。一元通用函数是,对单个输入操作。二元通用函数是对两个输入进行操作。
1、数组的运算。利用了python的原生运算符,标准的,加减乘除都可以用。及,逻辑非,指数**,模(余数)运算符%,地板除法运算符//,。都是一元通用函数。
2、绝对值。Python绝对值abs(x)。对应Numpy通用函数是np. absolute(x),也可以用别名,np. abs(x)
复数的幅度:复数的实部和虚部平方和再开方
3、三角函数
180度=pi
4、指数和对数运算
exp(x)指e的x次幂
exp2(x)指2的x次幂
power(3,x)指3的x次幂
5、专用通用函数
from scipy import special 包含了,很全的通用数学函数运算,包括统计学很多的运算。搜索,gamma function python
2.3.4高级的通用函数特性
1.指定输出
在进行大量运算的时候,指定一个存放运算结果的的数组是非常有用的。所有的通用函数都可以用out 参数来指定计算结果的存放位置。
第一种,直接复制。占用大量内存。
第二种,使用out参数储存。内存占用较小。
注意:第一种用的empty(),生成的数组内元素是科学记数法,第二种用的zeros(),生成的数组内元素,是float型。
如果不需要调格,直接out=y
2.聚合
二元通用函数,有聚合功能。比如,一样用一个,特定的运算,reduce,一个数组。可以对任何一个通用函数调用reduce()方法。一个reduce方法,会对给定的元素和操作,重复执行,直到得到单个结果。
例如,对add函数,调用reduce方法,,会返回数组中所有元素的和。
x = np. arange(1,6)
np. add. reduce(x)
#结果是15
如果需要存储每次计算的中间结果,使用accumulate
np. add.accumulate(x)
#结果是[1,3,6,10,15]
3.外积
任何通用函数,可以用outet方法,获取不同数组的,所有元素,对函数运算的,结果。
x=np. arange(1,6)
np. multiply.outer(x,x)
广播
通用函数另一个非常有用的特性,是它能操作不同大小和形状的数组。一组这样的操作,被称为:广播。
通用函数更多的信息可以在,www.numpy.org和www.scipy.org找到
2.4聚合
最大值,最小值,其他值
数组值求合,sum(ar)/np.sum(ar)是在编译码中进行,更快。
最大值max(ar)最小值min(ar),np中也有对应的,且更快。
np中,可以直接调用。ar. min()
1.多纬度聚合。使用参数axis=1/0参数
ar. min(axis=0)。axis关键字,指定的是数组将会被折叠的纬度,axis=0表示,在水平方向上折叠。也意味着每一列的值都将被聚合。
np. percentile(ar,25)四分之一位
np. percentile(ar)中位数
np. percentile(ar,75)四分之三位
2.5数组的计算:广播
向量化操作:1、通过Numpy通用函数。减少python循环2、利用Numpy广播功能。
广播:简单理解为,用于不同大小数组的,二进制通用函数(加,减,乘等)的一组规则。
对于同样大小的数组,二进制的操作是对相应的元素进行逐个计算。
广播允许这些二进制操作可以用于不同大小的数组。例如,可以简单地将一个标量(可以看成一个0维的数组),和一个数组相加。
a=[0,1,2]
print(a+5)
#[5,6,7]可以理解为,将数值5扩展或重复至数组[5,5,5]进行加法操作。实际上这个重复并没有发生。不占用计算。
实际上广播就是,扩展,把要操作的两个数组,扩展到相同的纬度,两个形状一致后,进行运算。
这里这个一维数组就被扩展或者,广播了。
[[0,1,2],
[0,1,2],
[0,1,2]]然后再对应相加。
[[0,1,2],
[0,1,2],
[0,1,2]]加上
[[0,0,0],
[1,1,1],
[2,2,2]]
这里就将两个数组都扩展成一个公共的形状。
广播的规则
广播就是,维度的匹配。
广播的规则,对于任意二进制通用函数都是适用的。
可视化时:
plt. hist(ar,30)#30指的是分组数
对数组进行,大于小于等于不等于大于等于小于等于,某个值,都会的到一个布尔型数据组成的数组。
操作布尔数组
np. random. RandonState(0)和np. random. seed(0)两种确定随机数的区别
numpy.random.RandomState()或者numpy.random.RandomState(seed=None)
每次生成数字不一样。
numpy.random.RandomState(1)或者numpy.random.RandomState(seed=1)
每次生成的数字一样。1,2仅仅是来源于1号种子,还是2号种子
存在一个数组,ar
np. count_nonzero(ar<6)。得到,ar<6这个布尔数组,里面 true的个数。
np. sum(ar<6)#得到和上面一样的结果,并且,sum和其他聚合函数一样,可以沿着行或者列进行。
np. sum(ar<6,axis=1)#每一行小于6的个数
要快速检查任意np.any(ar>6),或者全部np. all(ar>6)都是返回一个值。也都可以用axis设置特定坐标轴。np. any(x>6,axis=1)沿着横轴。
2.布尔运算符。逐位逻辑运算符(也叫逻辑运算符)(&、|、^、~),来进行,逐位运算(通常是布尔运算)
异或XOR ,在英文里面的定义为either one (is one), but not both, 也即只有一个为真(1)时,取真(1)
跟或的区别是,1 or 1 结果为true
将布尔数组作为掩码
ar#数组
ar>5#得到布尔数组
ar[ar>5]#掩码操作,将符合条件的选择出来
ar>5的数组就相当于一个掩码数组。
关键字and/or 和逻辑操作运算符&及 | 区别
and和or判断的是两个对象,每个对象,它整个对象是真还是假表达式操作的是整个对象,把这个对象当做布尔实体,非0都是true。
&和|判断的是,两个对象,每个对象,它的比特位。表达式操作的是元素的比特,将and和or运用于,组成改元素的每个比特。
上图用&和|进行运算时,对应的二进制比特位进行比较,以得到最终结果。
Python中的bin()方法的作用:
是将整型转换为二进制数组成的字符串,注意它的结果是个字符串,且转换后的最高位非零(如bin(1)=‘0b1’,而非‘0b01’),并在前面加上0b,表示这是一个二进制。
当对两个布尔型数组进行操作的时候,用|和&,如果用and或or就会出错。
因为,and和or对整个对象执行单个布尔运算,而&和I对一个对象的内容(单个比特或字节)执行多个布尔运算。
其他索引类型
np.random.randint(a,size=None,replace=True,p=None)
a,是从哪里选
size是选择的个数
replace为true的意思是,size设置为任意正值,false的意思是,size的值不能比原来a的长度len(a)大。
#在(0,5)区间内生成含5个数据的一维数组
>>a = np.random.randint(0, 5, (5,))
>>print('a = ', a)
a = [2 1 2 1 3]
#在a数组中抽取6个数,replace为true
>>b = np.random.choice(a, 6)
>>print('b = ', b)
b = [1 1 2 2 1]
#replace为False时,size需小于等于len(a)
>>c = np.random.choice(a, 5, replace=False, p=None)
>>print('c = ', c)
c = [3 2 1 1 2]
#p是数组a中所有数出现的概率,总和为1
>>d = np.random.choice(a, 5, replace=False, p=[0.2, 0.3, 0.1, 0.3, 0.1])
>>print('d = ', d)
d = [1 3 2 1 2]
np.savetxt('ceshi.txt',ar,fmt = '%0f',delimiter=',')
#数字格式化 https://www.runoob.com/python/att-string-format.html
np.newaxis终极解释
关于理解,数据科学手册,第42页,还有广播的部分,及79页相临点进行求距离的部分。