一.数组操作
1.迭代数组
(1)迭代器对象(Nditer):
迭代器对象(numpy.nditer)提供了1种灵活访问数组元素的方式
将a变为迭代器对象:np.nditer(<a>[,order='C',op_flags=['<mode>'],flags=['<flag>']])
#参数说明:
a:可为num/str/list/tuple/bool,不可包含dict
order:指定遍历顺序;可为C(优先行),F(优先列)
mode:模式;默认为只读(readonly);如要在遍历中修改数组元素,应设为读写(readwrite)/只写(writeonly)
flag:可接受c_index(可以跟踪C顺序的索引),f_index(可以跟踪Fortran顺序的索引),multi_index(每次迭代可以跟踪一种索引类型),external_loop(给出1维数组,而非0维数组)
#实例:
>>> a=np.array([[0,5,10,15],[20,25,30,35],[40,45,50,55]])
>>> for x in np.nditer(a, op_flags=['readwrite']):
... x[...]=2*x
...
>>> print(a)
[[ 0 10 20 30]
[ 40 50 60 70]
[ 80 90 100 110]]
>>> for x in np.nditer(a,op_flags=['readonly']):
... x[...]=2*x
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ValueError: assignment destination is read-only
>>> a=np.array([[0,5,10,15],[20,25,30,35],[40,45,50,55]])
>>> for x in np.nditer(a,flags=['external_loop'],order='F'):
... print(x,end=",")
...
[ 0 20 40],[ 5 25 45],[10 30 50],[15 35 55],
(2)for循环:
for i in <nditer>:
pass
#默认顺序和数组的内存布局一致(以提升访问的效率)
#可通过order参数改变遍历顺序
#a与a.T的存储顺序相同(按行模式(C)),因而遍历顺序相同
#实例:
#默认顺序和数组的内存布局一致
>>> a=np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> for i in np.nditer(a):
... print(i,end=",")
...
1,2,3,4,5,6,7,8,9,
#迭代数组本身只能得到其中包含的数组
>>> for i in a:
... print(i)
...
[1 2 3]
[4 5 6]
[7 8 9]
>>> for i in np.nditer(a.copy(order='C')):
... print(i,end=',')
...
1,2,3,4,5,6,7,8,9
>>> for i in np.nditer(a.T.copy(order='C')):
... print(i,end=',')
...
1,4,7,2,5,8,3,6,9
>>> for i in np.nditer(a.T):
... print(i,end=',')
...
1,2,3,4,5,6,7,8,9
>>> for i in np.nditer(a.copy(order='F')):
... print(i,end=',')
...
1,4,7,2,5,8,3,6,9
>>> for i in np.nditer(a.T.copy(order='F')):
... print(i,end=',')
...
1,2,3,4,5,6,7,8,9
(3)广播迭代:
如果两个数组是可广播的,Nditer组合对象能够同时迭代它们
#实例:
>>> a=np.array([[0,5,10,15],[20,25,30,35],[40,45,50,55]])
>>> for x,y in np.nditer([a,b]):
... print(x,y,end=',')
...
0 1,5 2,10 3,15 4,20 1,25 2,30 3,35 4,40 1,45 2,50 3,55 4,
2.修改数组操作:
(1)修改数组形状:
np.reshape(<arr>,<newshape>[,order='C']):在不改变数据的条件下修改数组arr的形状
<arr>.reshape(<newspace>[,order='C']):同上
#返回修改后的arr的副本
#参数说明:
newshape:指定新形状;整数或整数数组
格式:x1,x2.../[x1,x2...];新数组为x1×x2×...
新形状应当兼容原形状(要求x1*x2*...=原数组元素数)
order:可为'C'(按行),'F'(按列),'A'(按原顺序),'K'(按内存中的出现顺序)
#实例:
>>> a=np.arange(8)
>>> print(a)
[0 1 2 3 4 5 6 7]
>>> b=a.reshape(2,4)
>>> print(b)
[[0 1 2 3]
[4 5 6 7]]
##########################################################
np.resize(<arr>,<shape>):修改数组arr的形状
<arr>.resize(<shape>)
#后1种写法直接修改原数组,返回值是None
#参数说明:
shape:指定修改后的行政
格式:(x1,x2...);要求arr的元素数≤x1×x2×...
<arr>.resize()中也可直接写为x1,x2...
#实例:
>>> a=np.arange(8).reshape(2,4)
>>> print(a)
[[0 1 2 3]
[4 5 6 7]]
>>> b=np.resize(a,(4,2))
>>> print(b)
[[0 1]
[2 3]
[4 5]
[6 7]]
>>> print(a)
[[0 1 2 3]
[4 5 6 7]]
>>> a.resize(4,2)
>>> print(a)
[[0 1]
[2 3]
[4 5]
[6 7]]
(2)flat属性:
<ndarray>.flat:要对数组中每个元素都进行处理时,可使用flat属性
#该属性是1个数组元素迭代器
#参数说明:
ndarray:要进行处理的数组
#实例:
>>> a=np.arange(9).reshape(3,3)
>>> for row in a:
... print(row,end=";")
...
[0 1 2];[3 4 5];[6 7 8];
>>> for ele in a.flat:
... print(ele,end=";")
...
0;1;2;3;4;5;6;7;8;
(3)展平数组:
<ndarray>.flatten([order='C']):展平数组
#参数说明:
order:指定如何展开;可为'C','F','A','K'
#实例:
>>> a=np.arange(8).reshape(2,4)
>>> print(a)
[[0 1 2 3]
[4 5 6 7]]
>>> b=a.flatten()
>>> print(b)
[0 1 2 3 4 5 6 7]
>>> c=a.flatten(order='F')
>>> print(c)
[0 4 1 5 2 6 3 7]
>>> d=a.flatten(order='A')
>>> print(d)
[0 1 2 3 4 5 6 7]
>>> e=a.flatten(order='K')
>>> print(e)
[0 1 2 3 4 5 6 7]
>>> b[1]=0
>>> print(b)
[0 0 2 3 4 5 6 7]
>>> print(a)
[[0 1 2 3]
[4 5 6 7]]
(4)ravel():
np.ravel(<ndarray>[,order='C']):展平数组
<ndarray>.ravel(order='C'):同上
#后1种写法时修改返回的数组会影响原数组
#实例:
>>> a=np.arange(8).reshape(2,4)
>>> print(a)
[[0 1 2 3]
[4 5 6 7]]
>>> b=a.ravel()
>>> print(b)
[0 1 2 3 4 5 6 7]
>>> c=np.ravel(a,order='F')
>>> print(c)
[0 4 1 5 2 6 3 7]
>>> d=a.ravel()
>>> d[3]=0
>>> print(a)
[[0 1 2 0]
[4 5 6 7]]
3.翻转数组
(1)transpose():
np.transpose(<arr>[,<axes>]):用于对换数组arr的维度
<arr>.transpose([<axes>])
#参数说明:
axes:整数列表,对应维度;默认为[n...2,1]
#不翻转时为[1,2...n]
#实例:
>>> a=np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
>>> b=a.transpose()
>>> print(b)
[[[1 5]
[3 7]]
[[2 6]
[4 8]]]
>>> b=a.transpose([1,0,2])
>>> print(b)
[[[1 2]
[5 6]]
[[3 4]
[7 8]]]
>>> b=a.transpose([0,1,2])
>>> print(b)
[[[1 2]
[3 4]]
[[5 6]
[7 8]]]
>>> b=a.transpose([1,2,0])
>>> print(b)
[[[1 5]
[2 6]]
[[3 7]
[4 8]]]
>>> b=a.transpose([0,2,1])
>>> print(b)
[[[1 3]
[2 4]]
[[5 7]
[6 8]]]
>>> b=a.transpose([2,1,0])
>>> print(b)
[[[1 5]
[3 7]]
[[2 6]
[4 8]]]
(2)T属性:
<arr>.T:功能同transpose()的默认状态
#实例:
>>> a=np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
>>> b=a.transpose()
>>> print(b)
[[[1 5]
[3 7]]
[[2 6]
[4 8]]]
>>> print(a.T)
[[[1 5]
[3 7]]
[[2 6]
[4 8]]]
(3)rollaxis():
np.rollaxis(<arr>,<axis>,<start>):向后滚动指定轴到指定位置
#默认情况下维度排序从
#参数说明:
arr:数组
axis:要向后滚动的轴;其它轴的相对位置不变
strat:滚动到的位置;默认为0(完整的滚动)
#实例:
>>> a=np.arange(8).reshape([2,2,2])
#将轴2滚动到轴0(宽度到深度)
>>> b1=np.rollaxis(a,2)
>>> print(b1)
[[[0 2]
[4 6]]
[[1 3]
[5 7]]]
#将轴0滚动到轴1(宽度到高度)
>>> b2=np.rollaxis(a,2,1)
>>> print(b2)
[[[0 2]
[1 3]]
[[4 6]
[5 7]]]
(4)swapaxes():
np.swapaxes(<arr>,<axis1>,<axis2>):用于交换数组arr的2个轴
#参数说明:
axis1,axis2:指定2个轴;为int
#实例:
>>> a=np.arange(8).reshape([2,2,2])
>>> b=np.swapaxes(a,0,2)
>>> print(b)
[[[0 4]
[2 6]]
[[1 5]
[3 7]]]
4.修改数组维度
(1)broadcast():
np.broadcast(x,y):产生模仿广播的对象
#返回1个对象,该对象封装了将数组x广播到数组y的结果
#返回的对象有iterator属性(基于自身组件的迭代器元组)
#实例:
>>> x=np.array([[1,2],[3,4]])
>>> y=np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
>>> a=np.broadcast(x,y)
>>> print(a)
<numpy.broadcast object at 0x0000013C390E7760>
>>> print(a.shape)
(2, 2, 2)
>>> for i in a:
... print(i)
...
(1, 1)
(2, 2)
(3, 3)
(4, 4)
(1, 5)
(2, 6)
(3, 7)
(4, 8)
>>> x=np.array([[1],[2],[3]])
>>> y=np.array([4,5,6])
>>> b=np.broadcast(x,y)#对y广播x
>>> r,c=b.iters
#Python3.x为next(<context>),Python2.x为<context>.next()
>>> print (next(r),next(c))
1 4
>>> print (next(r),next(c))
1 5
>>> print(b.shape)
(3, 3)
#手动用broadcast()将x与y相加
>>> b=np.broadcast(x,y)
>>> c=np.empty(b.shape)
>>> print(c.shape)
(3, 3)
>>> c.flat=[u+v for (u,v) in b]
>>> print(c)
[[5. 6. 7.]
[6. 7. 8.]
[7. 8. 9.]]
#结果和NumPy内建的广播支持相同
>>> print(x+y)
[[5 6 7]
[6 7 8]
[7 8 9]]
(2)broadcast_to():
np.broadcast_to(<arr>,shape[,subok]):将数组arr广播到新形状
#返回只读视图
#如果新形状不符合NumPy的广播规则,可能会抛出ValueError
#参数说明:
shape:指定新形状
#实例:
>>> a=np.arange(4).reshape(1,4)
>>> print(a)
[[0 1 2 3]]
>>> b=np.broadcast_to(a,(4,4))
>>> print(b)
[[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]]
(3)expand_dims():
np.expand_dims(<arr>,axis=<x>):通过在指定位置插入新轴来扩展数组形状
#参数说明:
arr:要扩展的数组
x:新轴插入的位置
#实例:
>>> x=np.array([[1,2],[3,4]])
>>> y1=np.expand_dims(x,axis=0)
>>> print(y1)
[[[1 2]
[3 4]]]
>>> y2=np.expand_dims(x,axis=1)
>>> print(y2)
[[[1 2]]
[[3 4]]]
>>> print(x.shape,y1.shape,y2.shape)
(2, 2) (1, 2, 2) (2, 1, 2)
(4)squeeze():
np.squeeze(<arr>[,<axis>]):从数组arr中删除长度为1的维度
#将删除的维度中的内容放入上1个维度
#参数说明:
axis:整数/整数元组;用于选择形状中1维条目的子集
#实例:
>>> x=np.arange(9).reshape(1,3,3)
>>> print(x)
[[[0 1 2]
[3 4 5]
[6 7 8]]]
>>> y=np.squeeze(x)
>>> print(y)
[[0 1 2]
[3 4 5]
[6 7 8]]
5.拼接与分割数组
(1)concatenate():
concatenate((a1,a2...)[,axis=0]):沿指定轴连接数组序列
#参数说明:
a1,a2...:要拼接的数组
axis:指定沿哪个轴连接
#除该轴外的各轴长度应相等
#实例:
>>> a=np.array([[1,2],[3,4]])
>>> b=np.array([[5,6],[7,8]])
>>> c=np.concatenate((a,b))
>>> print(c)
[[1 2]
[3 4]
[5 6]
[7 8]]
>>> d=np.concatenate((a,b),axis=1)
>>> print(d)
[[1 2 5 6]
[3 4 7 8]]
>>> e=np.array([[5],[6]])
>>> f=np.concatenate((d,e),axis=1)
>>> print(f)
[[1 2 5 6 5]
[3 4 7 8 6]]
>>> g=np.concatenate((d,e))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<__array_function__ internals>", line 6, in concatenate
ValueError: all the input array dimensions for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 4 and the array at index 1 has size 1
(2)stack():
np.stack((a1,a2...)[,axis=0]):用于沿新轴连接数组序列
#会生成1个新维度,且所有数组必须同型
#参数说明:
a1,a2...:同型数组
axis:1个新轴,沿该轴连接
#实例:
>>> a=np.array([[1,2],[3,4]])
>>> b=np.array([[5,6],[7,8]])
>>> c=np.stack((a,b))
>>> print(c)
[[[1 2]
[3 4]]
>>> d=np.stack((a,b),axis=1)
>>> print(d)
[[[1 2]
[5 6]]
[[3 4]
[7 8]]]
>>> e=np.stack((a,b),axis=2)
>>> print(e)
[[[1 5]
[2 6]]
[[3 7]
[4 8]]]
>>> f=np.array([[1],[2]])
>>> print(np.stack((a,f),axis=1))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<__array_function__ internals>", line 6, in stack
File "C:\Users\1234\AppData\Roaming\Python\Python37\site-packages\numpy\core\shape_base.py", line 426, in stack
raise ValueError('all input arrays must have the same shape')
ValueError: all input arrays must have the same shape
##########################################################
np.hstack((a1,a2...)):通过水平堆叠拼接数组
#实例:
>>> a=np.array([[1,2],[3,4]])
>>> b=np.array([[5,6],[7,8]])
>>> print(np.hstack((a,b)))
[[1 2 5 6]
[3 4 7 8]]
##########################################################
np.vstack((a1,a2...)):通过垂直堆叠拼接数组
#实例:
>>> a=np.array([[1,2],[3,4]])
>>> b=np.array([[5,6],[7,8]])
>>> print(np.vstack((a,b)))
[[1 2]
[3 4]
[5 6]
[7 8]]
(3)split():
np.split(<arr>,<indices_or_sections>,axis=0):沿指定轴将数组arr分割为子数组
#参数说明:
indices_or_sections:指定如何分割;Int或arr
如果是n,将arr分割为n等分;要求n<axis的长度
如果是[n1,2n...],数组中元素为切分的位置(左开右闭)
axis:沿哪个轴切分;默认为0
#实例:
>>> e=np.arange(8)
>>> m,n,p,q=np.split(e,4)
>>> print(m,n,p,q)
[0 1] [2 3] [4 5] [6 7]
>>> m,n,p=np.split(e,[1,2])
>>> print(m,n,p)
[0] [1] [2 3 4 5 6 7]
##########################################################
np.hsplit(<arr>,<indices_or_sections>):用于沿高度轴分割数组arr
#实例:
>>> a=np.arange(10)
>>> print(np.hsplit(a,2))
[0 1 2 3 4] [5 6 7 8 9]
>>> m,n,q=np.hsplit(a,[2,3])
>>> print(m,n,q)
[0 1] [2] [3 4 5 6 7 8 9]
##########################################################
np.vsplit(<arr>,<indices_or_sections>):用于沿宽度轴分割数组arr
#要求arr至少有2个维度
#实例:
>>> a=np.array([[1,2],[3,4],[5,6],[7,8]])
>>> print(np.vsplit(a,2))
[array([[1, 2],
[3, 4]]), array([[5, 6],
[7, 8]])]
6.数组元素的操作
(1)添加元素:
np.append(arr,values[,axis=None]):在数组arr的末尾添加值
#默认返回1个1维数组(将原数组元素重新依次排列,并加入新元素)
#当axis不为None,arr和values的形状(axis轴的长度除外)必须相等,否则生成ValueError
#参数说明:
values:要追加的值;数组或元组;其中的值会被依次插入
axis:为None时,返回1维数组,在最右侧加成
有定义时,指定沿axis轴添加
#实例:
>>> a=np.array([[[1,2,3],[4,5,6]]])
>>> b=np.append(a,[0,0])
>>> print(b)
[1 2 3 4 5 6 0 0]
>>> c=np.append(a,[[[0]]],axis=0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<__array_function__ internals>", line 6, in append
File "C:\Users\1234\AppData\Roaming\Python\Python37\site-packages\numpy\lib\function_base.py", line 4693, in append
return concatenate((arr, values), axis=axis)
File "<__array_function__ internals>", line 6, in concatenate
ValueError: all the input array dimensions for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 2 and the array at index 1 has size 1
>>> c=np.append(a,[[[0,0,0],[10,10,10]]],axis=0)
>>> print(c)
[[[ 1 2 3]
[ 4 5 6]]
[[ 0 0 0]
[10 10 10]]]
>>> c=np.append(a,[[[0,0,0],[10,10,10]]],axis=1)
>>> print(c)
[[[ 1 2 3]
[ 4 5 6]
[ 0 0 0]
[10 10 10]]]
>>> c=np.append(a,[[[0,0,0],[10,10,10]]],axis=2)
>>> print(c)
[[[ 1 2 3 0 0 0]
[ 4 5 6 10 10 10]]]
##########################################################
np.insert(<arr>,<obj>,<values>[,axis=None]):在指定索引前,沿指定轴在数组arr中插入值
#参数说明:
values:要插入的值;数组或元组或num
#float会被截断到整数位
obj:指定索引;数组或整数
当obj为arr,values为num,在每个指定索引前插入值
当obj为num,values为arr,将在索引前插入所有值
当二者均为arr,在每个索引处插入对应值(2个array需等长)
axis:指定沿哪个轴插入;为None时数组会被展开(详情见append())
#实例:
>>> a=np.array([[1,2],[3,4],[5,6]])
>>> print(np.insert(a,6,[1,2]))
[1 2 3 4 5 6 1 2]
>>> print(np.insert(a,[1,3],[1,2]))
[1 1 2 3 2 4 5 6]
>>> print(np.insert(a,[1,3],[1,2,4]))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<__array_function__ internals>", line 6, in insert
File "C:\Users\1234\AppData\Roaming\Python\Python37\site-packages\numpy\lib\function_base.py", line 4628, in insert
new[tuple(slobj)] = values
ValueError: shape mismatch: value array of shape (3,) could not be broadcast to indexing result of shape (2,)
>>> print(np.insert(a,[1,3,4,5],[1,2,4]))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<__array_function__ internals>", line 6, in insert
File "C:\Users\1234\AppData\Roaming\Python\Python37\site-packages\numpy\lib\function_base.py", line 4628, in insert
new[tuple(slobj)] = values
ValueError: shape mismatch: value array of shape (3,) could not be broadcast to indexing result of shape (4,)
>>> print(np.insert(a,[1,3],2))
[1 2 2 3 2 4 5 6]
>>> print(np.insert(a,1,2,axis=0))
[[1 2]
[2 2]
[3 4]
[5 6]]
>>> print(np.insert(a,1,2,axis=1))
[[1 2 2]
[3 2 4]
[5 2 6]]
>>> print(np.insert(a,[1,2],[2,0],axis=1))
[[1 2 2 0]
[3 2 4 0]
[5 2 6 0]]
(2)删除元素:
np.delete(<arr>,<obj>[,axis=None]):返回从数组arr中删除了指定子数组的新数组
#参数说明:
obj:要删除的子数组;可以被切片,整数或者整数数组
axis:按axis删除(非沿axis删除);为None时会展开数组
#实例:
>>> print(np.delete(a,3))
[ 0 1 2 4 5 6 7 8 9 10 11]
>>> print(np.delete(a,[1,2]))
[ 0 3 4 5 6 7 8 9 10 11]
#以下让我很混乱
>>> print(np.delete(a,[[1,2],[0,1]]))
[ 3 4 5 6 7 8 9 10 11]
>>> print(np.delete(a,[[1,2],[0,1]],axis=1))
[[ 3]
[ 7]
[11]]
>>> print(np.delete(a,[[1,2],[0,1]],axis=0))
[]
>>> print(np.delete(a,2,axis=0))
[[0 1 2 3]
[4 5 6 7]]
(3)去重:
np.unique(<arr>[,return_index=False,return_inverse=False,return_counts=False]):去除数组arr中的重复元素
#arr会被展开,返回重复值已被去除的1维数组
#参数说明:
return_index:如果为True,返回新列表元素在旧列表中位置,并以列表形式储
return_inverse:如果为True,返回旧列表元素在新列表中位置,并以列表形式储
return_counts:如果为True,返回新数组中元素在原数组中的出现次数
#实例:
>>> a=np.array([5,2,6,2,7,5,6,8,2,9])
>>> u=np.unique(a)
>>> print(u)
[2 5 6 7 8 9]
>>> u,indices=np.unique(a,return_index=True)
>>> print(u,indices)
[2 5 6 7 8 9] [1 0 2 4 7 9]
>>> u,indices=np.unique(a,return_inverse=True)
>>> print(u,indices)
[2 5 6 7 8 9] [1 0 2 0 3 1 2 4 0 5]
>>> u,indices=np.unique(a,return_counts=True)
>>> print(u,indices)
[2 5 6 7 8 9] [3 2 2 1 1 1]
7.生成网格点:
[<m>,<n>]numpy.meshgrid(<x>,<y>):生成网格点坐标矩阵
#即生成所有(xi,yj)构成的矩阵
#参数说明:
x,y:分别指定各"网格线"的x/y坐标(见下图)
m,n:分别接收返回的"全部数据点"的x/y坐标
#也可以只用1个参数接收
#实例:
>>> import numpy as np
>>> a=np.array([1,2,3])
>>> b=np.array([7,8,9])
>>> res=np.meshgrid(a,b)
>>> print(res)
[array([[1, 2, 3],#数据点从x坐标
[1, 2, 3],
[1, 2, 3]]), array([[7, 7, 7],
[8, 8, 8],
[9, 9, 9]])]#数据点的y坐标
二.位运算函数
1.位与运算:
np.bitwise_and(a,b):对多维数组a,b中的对应元素执行位与运算
#对int和int来说相当于&
#实例:
>>> a=np.bitwise_and(13,17)
>>> print(a)
1
>>> a=np.bitwise_and((13,17),(9,2))
>>> print(a)
[9 0]
>>> a=np.bitwise_and([(13,17),(3,4)],[(9,2),(5,1)])
>>> print(a)
[[9 0]
[1 0]]
2.位或运算:
np.bitwise_or(a,b):对多维数组a,b中的对应元素执行位或运算
#对int和int来说相当于|
#实例:
>>> a=np.bitwise_or([[1,3],[0,2]],[[4,5],[7,1]])
>>> print(a)
[[5 7]
[7 3]]
3.位非运算:
np.invert(a):对数组a中整数执行位非运算
np.bitwise_not(a):功能同invert()
#位非运算是对补码的每位取反
#对int相当于~
#实例:
>>> np.invert(5)
-6
>>> print(bin(5),bin(-6))
0b101 -0b110
#+----+--------+---------+
#| |5 |-6 |
#+----+--------+---------+
#|原码|0000 0101|1000 0110|
#+----+--------+---------+
#|反码|0000 0101|1111 1001|
#+----+--------+---------+
#|补码|0000 0101|1111 1010|
#+----+--------+---------+
3.移动位:
np.left_shift(a,n):将数组a中元素的2进制形式左移n位
#移动后右侧空出的地方用0填充
#实例:
>>> print(np.left_shift([1,2],3))
[ 8 16]
>>> print(np.array([[bin(1),bin(2)],[bin(8),bin(16)]]))
[['0b1' '0b10']
['0b1000' '0b10000']]
##########################################################
np.right_shift(a,n):将数组a中元素的2进制形式右移n位
#移动后左侧空出的地方用0填充
#移动后超出整数范围的位直接删除
#实例:
>>> print(np.array([[bin(11),bin(19)],[bin(1),bin(2)]]))
[['0b1011' '0b10011']
['0b1' '0b10']]
>>> print(np.right_shift(2,4))
0
>>> print([bin(2)],[bin(0)])
['0b10'] ['0b0']#超出整数范围的位被删除