Python 第三方模块 科学计算 NumPy模块 数组操作与位运算

66 篇文章 5 订阅
54 篇文章 13 订阅

一.数组操作
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']#超出整数范围的位被删除
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值