import numpy as np
函数的方法
a = np.arange(9)
#addd的方法
print('add方法')
#reduce==sum 总和,返回一个数
print('reduce')
print(np.add.reduce(a))
print(a.sum())
#accumulate==cumsum 累计和,返回一数组
print('accumulate')
print(np.add.accumulate(a))
print(a.cumsum())
#outer 返回一个数组,这个数组的秩是输入两个的数组的秩的和
print('outer')
b = np.arange(3)
c = np.add.outer(a,b)
print(c)
#验证一下
print(np.linalg.matrix_rank(a))
print(np.linalg.matrix_rank(b))
print(np.linalg.matrix_rank(c))
#reduceat
print('reduceat')
print(np.add.reduceat(a, [0, 5, 2, 7]))
print(np.add.reduce(a[0:5]))
print(a[5])
print(np.add.reduce(a[2:7]))
print(np.add.reduce(a[7:]))
add方法
reduce
36
36
accumulate
[ 0 1 3 6 10 15 21 28 36]
[ 0 1 3 6 10 15 21 28 36]
outer
[[ 0 1 2]
[ 1 2 3]
[ 2 3 4]
[ 3 4 5]
[ 4 5 6]
[ 5 6 7]
[ 6 7 8]
[ 7 8 9]
[ 8 9 10]]
1
1
2
reduceat
[10 5 20 15]
10
5
20
15
reducead的输入参数为两个,一个是要计算的数组,一个是索引
计算方法是:
结果的第一个元素是0到5的索引的和
结果的第二个元素是5的索引(因为5>2)
结果的第三个元素是2到7的索引的和
结果的第四个元素是7到end的索引的和
算术运算
#四则运算
d = np.array([1,5,4,3])
e = np.array([6,7,9,7])
print('加法')
print(np.add(d,e))
print('减法')
print(np.subtract(d,e))
print('乘法')
print(np.multiply(d,e))
print('除法')
print('divide')
print(np.divide(d,e)) #只保留整数==/
print(np.divide(e,d))
print('/') #与/的运算结果一致
print(d/e)
print(e/d)
print('true_divide')
print(np.true_divide(d,e)) #保留小数
print(np.true_divide(e,d))
print('floor_divide')
print(np.floor_divide(d,e)) #除完后向下取整==//
print(np.floor_divide(e,d))
print('//') #与//的运算结果一致
print(d//e)
print(e//d)
加法
[ 7 12 13 10]
减法
[-5 -2 -5 -4]
乘法
[ 6 35 36 21]
除法
divide
[0.16666667 0.71428571 0.44444444 0.42857143]
[6. 1.4 2.25 2.33333333]
/
[0.16666667 0.71428571 0.44444444 0.42857143]
[6. 1.4 2.25 2.33333333]
true_divide
[0.16666667 0.71428571 0.44444444 0.42857143]
[6. 1.4 2.25 2.33333333]
floor_divide
[0 0 0 0]
[6 1 2 2]
//
[0 0 0 0]
[6 1 2 2]
在python3.7.4中np.divide和’/'并不只保留整数,还保留小数
# 模运算
f = np.arange(-4,4)
#remainder==mod==%
print('remainder')
print(np.remainder(f,2)) #对2取模
print('mod')
print(np.mod(f,2))
print('%')
print(f % 2)
print('fmod') #取模 结果的正负号由被除数决定
print(f) #除数
print(np.fmod(f,2))
remainder
[0 1 0 1 0 1 0 1]
mod
[0 1 0 1 0 1 0 1]
%
[0 1 0 1 0 1 0 1]
fmod
[-4 -3 -2 -1 0 1 2 3]
[ 0 -1 0 -1 0 1 0 1]
斐波那契数列
又称黄金分割数列,数列的特点是以递归的方式定义,其中元素之间满足关系: F ( 1 ) = 1 , F ( 2 ) = 1 , F ( 3 ) = F ( 2 ) + F ( 1 ) = 2 , . . . , F ( n ) = F ( n − 1 ) + F ( n − 2 ) ( n > = 3 , n ∈ N ∗ ) F(1)=1,F(2)=1,F(3)=F(2)+F(1)=2,...,F(n)=F(n-1)+F(n-2) (n>=3,n\in{N^*}) F(1)=1,F(2)=1,F(3)=F(2)+F(1)=2,...,F(n)=F(n−1)+F(n−2)(n>=3,n∈N∗)
#利用矩阵相乘创建
#基础矩阵
g = np.matrix([[1, 1], [1,0]])
print(g)
print('基矩阵自身相乘')
h = g*g
print(h)
print('斐波那契数列第一个数')
print(h[0,0])
print('基矩阵自身相乘六次')
i = g**7
print(i)
print('斐波那契数列第八个数')
print(i[0,0])
[[1 1]
[1 0]]
基矩阵自身相乘
[[2 1]
[1 1]]
斐波那契数列第一个数
2
基矩阵自身相乘六次
[[21 13]
[13 8]]
斐波那契数列第八个数
21
矩阵相乘得到斐波那契数列的原理:
(
1
1
1
0
)
∗
(
1
1
1
0
)
=
(
1
∗
1
+
1
∗
1
1
1
1
)
=
(
2
1
1
1
)
\begin{pmatrix}1&1\\1&0\\\end{pmatrix} * \begin{pmatrix}1&1\\1&0\\\end{pmatrix} = \begin{pmatrix}{1*1+1*1}&1\\1&1\\\end{pmatrix} = \begin{pmatrix}2&1\\1&1\\\end{pmatrix}
(1110)∗(1110)=(1∗1+1∗1111)=(2111)
基矩阵子相乘一次(g * g)第一个元素为F(3)=2
(
2
1
1
1
)
∗
(
1
1
1
0
)
=
(
1
∗
2
+
1
∗
1
1
2
0
)
=
(
3
2
2
1
)
\begin{pmatrix}2&1\\1&1\\\end{pmatrix} * \begin{pmatrix}1&1\\1&0\\\end{pmatrix} = \begin{pmatrix}{1*2+1*1}&1\\2&0\\\end{pmatrix} = \begin{pmatrix}3&2\\2&1\\\end{pmatrix}
(2111)∗(1110)=(1∗2+1∗1210)=(3221)
基矩阵子相乘两次(g * g * g=g** 3)第一个元素为F(4)=F(3)+F(2)=2+1=3
…
基矩阵子相乘n次(g * g * g …=g** (n+1))第一个元素为F(n+2)=F(n)+F(n-1)
#利用黄金分割公式创建
j = np.arange(1,9) #计算前八个斐波那契数列
print(j)
k = np.sqrt(5) #根号5
a = (1+k)/2
b = (1-k)/2
m = (a**j - b**j)/k #见下面的公式(12)
print(m)
print('结果')
n = np.rint(m) #取整(类型不变)
print(n)
[1 2 3 4 5 6 7 8]
[ 1. 1. 2. 3. 5. 8. 13. 21.]
结果
[ 1. 1. 2. 3. 5. 8. 13. 21.]
黄金分割公式如下:其中a为总长,b为段长
b
2
=
a
∗
(
a
−
b
)
=
a
2
−
a
∗
b
b^2 = a*(a-b)=a^2-a*b
b2=a∗(a−b)=a2−a∗b
解得
b
a
=
5
−
1
2
≈
0.618
\frac{b}{a}=\frac{\sqrt{5}-1}{2}\approx0.618
ab=25−1≈0.618
斐波那契数列和黄金分割的关系是:从三个元素开始,相邻两个元素的商接近黄金分割比例,数值越大越接近
2
3
≈
0.6667
\frac{2}{3}\approx0.6667
32≈0.6667
3
5
=
0.6
\frac{3}{5}=0.6
53=0.6
…
13
21
≈
0.619
\frac{13}{21}\approx0.619
2113≈0.619
…
lim
n
→
+
∞
a
n
a
n
−
1
=
5
−
1
2
≈
0.618
\lim_{n\to+\infty} \frac{a_n}{a_{n-1}}=\frac{\sqrt{5}-1}{2}\approx0.618
n→+∞liman−1an=25−1≈0.618
斐波那契数列的通项推导
下面根据矩阵创建方式推导斐波那契数列的通项F(n):
根据矩阵相乘得到的规律,由基矩阵相乘n-2次(n-1次方)得到矩阵:
(
1
1
1
0
)
n
=
(
F
(
n
)
x
1
x
1
x
2
)
(1)
{\begin{pmatrix}1&1\\1&0\\\end{pmatrix}}^{n} = \begin{pmatrix}F(n)&x1\\x1&x2\\\end{pmatrix}\tag{1}
(1110)n=(F(n)x1x1x2)(1)
由基矩阵相乘n-1次(n次方)得到矩阵如下公式,再代入(1)式化简如下:
(
1
1
1
0
)
n
=
(
F
(
n
+
1
)
y
1
y
1
y
2
)
=
(
F
(
n
)
x
1
x
1
x
2
)
∗
(
1
1
1
0
)
=
(
F
(
n
)
+
x
1
F
(
n
)
x
1
+
x
2
x
1
)
(2)
{\begin{pmatrix}1&1\\1&0\\\end{pmatrix}}^{n} = \begin{pmatrix}F(n+1)&y1\\y1&y2\\\end{pmatrix} = \begin{pmatrix}F(n)&x1\\x1&x2\\\end{pmatrix}*\begin{pmatrix}1&1\\1&0\\\end{pmatrix} = \begin{pmatrix}F(n)+x1&F(n)\\x1+x2&x1\\\end{pmatrix}\tag{2}
(1110)n=(F(n+1)y1y1y2)=(F(n)x1x1x2)∗(1110)=(F(n)+x1x1+x2F(n)x1)(2)
左右两边对应相等可以得到:
{
F
(
n
+
1
)
=
F
(
n
)
+
x
1
y
1
=
F
(
n
)
y
1
=
x
1
+
x
2
y
2
=
x
1
(3)
\begin{cases}F(n+1)=F(n)+x1\\y1=F(n)\\y1=x1+x2\\y2=x1\end{cases}\tag{3}
⎩⎪⎪⎪⎨⎪⎪⎪⎧F(n+1)=F(n)+x1y1=F(n)y1=x1+x2y2=x1(3)
由斐波那契数列的特点可以得到:
{
F
(
n
+
1
)
=
F
(
n
)
+
F
(
n
−
1
)
F
(
n
)
=
F
(
n
−
1
)
+
F
(
n
−
2
)
(4)
\begin{cases}F(n+1)=F(n)+F(n-1)\\ F(n)=F(n-1)+F(n-2)\end{cases}\tag{4}
{F(n+1)=F(n)+F(n−1)F(n)=F(n−1)+F(n−2)(4)
将(4)式代入(3)式可以得到
{
x
1
=
F
(
n
−
1
)
y
1
=
F
(
n
)
x
2
=
F
(
n
−
2
)
y
2
=
F
(
n
−
1
)
(5)
\begin{cases}x1=F(n-1)\\y1=F(n)\\x2=F(n-2)\\y2=F(n-1)\end{cases}\tag{5}
⎩⎪⎪⎪⎨⎪⎪⎪⎧x1=F(n−1)y1=F(n)x2=F(n−2)y2=F(n−1)(5)
代入(2)式可得
( 1 1 1 0 ) n = ( F ( n + 1 ) F ( n ) F ( n ) F ( n − 1 ) ) (6) {\begin{pmatrix}1&1\\1&0\\\end{pmatrix}}^{n} = \begin{pmatrix}F(n+1)&F(n)\\F(n)&F(n-1)\\\end{pmatrix}\tag{6} (1110)n=(F(n+1)F(n)F(n)F(n−1))(6)
所以接下来的问题就是求解:
(
1
1
1
0
)
n
(7)
{\begin{pmatrix}1&1\\1&0\\\end{pmatrix}^n}\tag{7}
(1110)n(7)
先求
A
=
(
1
1
1
0
)
A={\begin{pmatrix}1&1\\1&0\\\end{pmatrix}}
A=(1110)的特征值,下面是A的特征方程:
∣ λ E − A ∣ = ∣ λ − 1 − 1 − 1 λ ∣ = λ 2 − λ − 1 = 0 (8) |\lambda E-A| = \begin{vmatrix}\lambda-1&-1\\-1&\lambda\\\end{vmatrix}=\lambda^2-\lambda-1=0\tag{8} ∣λE−A∣=∣∣∣∣λ−1−1−1λ∣∣∣∣=λ2−λ−1=0(8)
可以解得特征值为
λ
1
=
1
+
5
2
\lambda_1 = \frac{1+\sqrt{5}}{2}
λ1=21+5
λ
2
=
1
−
5
2
\lambda_2 = \frac{1-\sqrt{5}}{2}
λ2=21−5
由于二阶矩阵具有两个不同的特征值,所以矩阵A可对角化。
当
λ
=
1
+
5
2
\lambda= \frac{1+\sqrt{5}}{2}
λ=21+5代入
(
λ
E
−
A
)
x
=
0
(\lambda E-A)x=0
(λE−A)x=0得到
(
−
1
+
5
2
−
1
−
1
1
+
5
2
)
x
=
0
\begin{pmatrix}\frac{-1+\sqrt{5}}{2}&-1\\-1&\frac{1+\sqrt{5}}{2}\\\end{pmatrix}x=0
(2−1+5−1−121+5)x=0从而得到特征向量
α
1
=
(
1
−
1
+
5
2
)
\alpha_1 = \begin{pmatrix}1\\\frac{-1+\sqrt{5}}{2}\\\end{pmatrix}
α1=(12−1+5)
当
λ
=
1
−
5
2
\lambda= \frac{1-\sqrt{5}}{2}
λ=21−5代入
(
λ
E
−
A
)
x
=
0
(\lambda E-A)x=0
(λE−A)x=0得到
(
−
1
+
5
2
−
1
−
1
1
−
5
2
)
x
=
0
\begin{pmatrix}-\frac{1+\sqrt{5}}{2}&-1\\-1&\frac{1-\sqrt{5}}{2}\\\end{pmatrix}x=0
(−21+5−1−121−5)x=0从而得到特征向量
α
2
=
(
1
−
1
+
5
2
)
\alpha_2 = \begin{pmatrix}1\\-\frac{1+\sqrt{5}}{2}\\\end{pmatrix}
α2=(1−21+5)
构造可逆矩阵
P
=
(
α
1
,
α
2
)
=
(
1
1
−
1
+
5
2
−
1
+
5
2
)
P=(\alpha_1,\alpha_2)=\begin{pmatrix}1&1\\\frac{-1+\sqrt{5}}{2}&-\frac{1+\sqrt{5}}{2}\\\end{pmatrix}
P=(α1,α2)=(12−1+51−21+5)使得
A
=
P
Λ
P
−
1
A=P \Lambda P^{-1}
A=PΛP−1
所以
A
n
=
P
Λ
n
P
−
1
(9)
A^n =P \Lambda^n P^{-1}\tag{9}
An=PΛnP−1(9)
根据二阶方阵的求逆公式
(
a
b
c
d
)
−
1
=
1
a
c
−
b
d
(
d
−
b
−
c
a
)
{\begin{pmatrix}a&b\\c&d\\\end{pmatrix}}^{-1}=\frac{1}{ac-bd}\begin{pmatrix}d&-b\\-c&a\\\end{pmatrix}
(acbd)−1=ac−bd1(d−c−ba)得到:
P
−
1
=
−
1
5
(
−
1
+
5
2
−
1
−
−
1
+
5
2
1
)
=
1
5
(
1
+
5
2
1
−
1
+
5
2
−
1
)
(10)
P^{-1}=\frac{-1}{\sqrt{5}}\begin{pmatrix}-\frac{1+\sqrt{5}}{2}&-1\\-\frac{-1+\sqrt{5}}{2}&1\\\end{pmatrix} = \frac{1}{\sqrt{5}}\begin{pmatrix}\frac{1+\sqrt{5}}{2}&1\\\frac{-1+\sqrt{5}}{2}&-1\\\end{pmatrix}\tag{10}
P−1=5−1(−21+5−2−1+5−11)=51(21+52−1+51−1)(10)
将式(10)代入(9)可得:
A
n
=
(
1
1
−
1
+
5
2
−
1
+
5
2
)
(
(
1
+
5
2
)
n
0
0
(
1
−
5
2
)
n
)
1
5
(
1
+
5
2
1
−
1
+
5
2
−
1
)
=
(
(
1
+
5
2
)
n
(
1
−
5
2
)
n
−
1
+
5
2
(
1
+
5
2
)
n
−
1
+
5
2
(
1
−
5
2
)
n
)
1
5
(
1
+
5
2
1
−
1
+
5
2
−
1
)
=
1
5
(
(
1
+
5
2
)
n
(
1
−
5
2
)
n
(
1
+
5
2
)
n
−
1
(
1
−
5
2
)
n
−
1
)
(
1
+
5
2
1
−
1
+
5
2
−
1
)
=
1
5
(
(
(
1
+
5
2
)
n
+
1
−
(
1
−
5
2
)
n
+
1
)
(
(
1
+
5
2
)
n
−
(
1
−
5
2
)
n
)
(
1
+
5
2
)
n
−
(
1
−
5
2
)
n
(
1
+
5
2
)
n
−
1
−
(
1
−
5
2
)
n
−
1
)
(11)
A^n=\begin{pmatrix}1&1\\\frac{-1+\sqrt{5}}{2}&-\frac{1+\sqrt{5}}{2}\\\end{pmatrix} \begin{pmatrix}(\frac{1+\sqrt{5}}{2})^n&0\\0&(\frac{1-\sqrt{5}}{2})^n\\\end{pmatrix} \frac{1}{\sqrt{5}}\begin{pmatrix}\frac{1+\sqrt{5}}{2}&1\\\frac{-1+\sqrt{5}}{2}&-1\\\end{pmatrix}\\= \begin{pmatrix}(\frac{1+\sqrt{5}}{2})^n&(\frac{1-\sqrt{5}}{2})^n\\\frac{-1+\sqrt{5}}{2}(\frac{1+\sqrt{5}}{2})^n &-\frac{1+\sqrt{5}}{2}(\frac{1-\sqrt{5}}{2})^n\\\end{pmatrix} \frac{1}{\sqrt{5}}\begin{pmatrix}\frac{1+\sqrt{5}}{2}&1\\\frac{-1+\sqrt{5}}{2}&-1\\\end{pmatrix}\\= \frac{1}{\sqrt{5}}\begin{pmatrix}(\frac{1+\sqrt{5}}{2})^n&(\frac{1-\sqrt{5}}{2})^n\\(\frac{1+\sqrt{5}}{2})^{n-1} &(\frac{1-\sqrt{5}}{2})^{n-1}\\\end{pmatrix} \begin{pmatrix}\frac{1+\sqrt{5}}{2}&1\\\frac{-1+\sqrt{5}}{2}&-1\\\end{pmatrix}\\= \frac{1}{\sqrt{5}}\begin{pmatrix}((\frac{1+\sqrt{5}}{2})^{n+1}-(\frac{1-\sqrt{5}}{2})^{n+1})&((\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n)\\(\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n &(\frac{1+\sqrt{5}}{2})^{n-1}-(\frac{1-\sqrt{5}}{2})^{n-1}\\\end{pmatrix}\tag{11}
An=(12−1+51−21+5)((21+5)n00(21−5)n)51(21+52−1+51−1)=((21+5)n2−1+5(21+5)n(21−5)n−21+5(21−5)n)51(21+52−1+51−1)=51((21+5)n(21+5)n−1(21−5)n(21−5)n−1)(21+52−1+51−1)=51(((21+5)n+1−(21−5)n+1)(21+5)n−(21−5)n((21+5)n−(21−5)n)(21+5)n−1−(21−5)n−1)(11)
将式(11)和式(6)对比,左右两变对应相等,可以得到F(n)的表达式:
F
(
n
)
=
1
5
(
1
+
5
2
)
n
−
(
1
−
5
2
)
n
)
(12)
F(n) = \frac{1}{\sqrt{5}} (\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n)\tag{12}
F(n)=51(21+5)n−(21−5)n)(12)
波形绘制
方波
方波的傅里叶级数为 ∑ k = 1 + ∞ 4 s i n ( ( 2 k − 1 ) t ) ( 2 k − 1 ) π \sum_{k=1}^{+\infty}\frac{4sin((2k-1)t)}{(2k-1)\pi} ∑k=1+∞(2k−1)π4sin((2k−1)t)
import matplotlib.pyplot as plt
%matplotlib inline
#根据傅里叶级数画图
t = np.linspace(-np.pi,np.pi,201)
k = np.arange(1,100) #序列
f = np.zeros_like(t) #初始化数组
#计算每一个点
for i in range(len(t)):
f[i] = np.sum((4*np.sin((2*k-1)*t[i]))/((2*k-1)*np.pi))
plt.plot(t,f)
锯齿波与三角波
锯齿波的傅里叶级数为
∑
k
=
1
+
∞
−
2
s
i
n
(
2
k
t
π
)
k
π
\sum_{k=1}^{+\infty}\frac{-2sin(2kt\pi)}{k\pi}
∑k=1+∞kπ−2sin(2ktπ)
而三角波的取值是锯齿波的绝对值
#根据傅里叶级数画图
t = np.linspace(-np.pi,np.pi,201)
k = np.arange(1,100) #序列
f = np.zeros_like(t) #初始化数组
#计算每一个点
for i in range(len(t)):
f[i] = np.sum((-2*np.sin(2*k*t[i]*np.pi))/(k*np.pi))
plt.subplot(121)
plt.plot(t,f)
plt.title('Sawtooth Wave')
plt.subplot(122)
plt.plot(t,np.abs(f))
plt.title('Triangular Wave')
利萨如曲线
利萨如曲线是两个沿着相互的垂直方向的正弦震荡合成的曲线,利用利萨如曲线可以欸测量出两个信号的频率差或相位差。
t = np.linspace(-np.pi,np.pi,201) #模拟时间点,从-Π到Π中产生201个均匀分布的点
a = 8 #x方向的震幅
b = 9 #y方向的震幅
x = np.sin(a*t + np.pi/2) #相位为二分之一Π
y = np.sin(b*t) #相位为0
plt.plot(x,y)
plt.show()
位操纵
#不等运算符(^)---符号不一致时返回负数
x = np.arange(-9,9)
y = -x
print(x^y)
print((x^y)<0)
#函数实现
z = np.bitwise_xor(x,y) #对应^
print(z)
print(np.less(z,0)) #对应<0
[ -2 -16 -2 -4 -2 -8 -2 -4 -2 0 -2 -4 -2 -8 -2 -4 -2 -16]
[ True True True True True True True True True False True True
True True True True True True]
[ -2 -16 -2 -4 -2 -8 -2 -4 -2 0 -2 -4 -2 -8 -2 -4 -2 -16]
[ True True True True True True True True True False True True
True True True True True True]
^ 其实是异或运算,要想得具体数值,需要把原来的十进制数值转为二进制补码进行计算,因为计算机是以补码的形式计算,而在显示过程又重新把其还原为十进制表示。下面是几种码的概念。
原码:最高位为符号位,1表示负数,0表示正数,其他为二进制数。9的原码是00001001,-9的原码是10001001
反码:正数的反码等于原码,负数的反码等于除符号位外,按位取反。9的反码是00001001,-9的反码是11110110
补码:正数的补码等于原码,而对于负数的补码,其计算规则符合:负数的补码等于反码+1。9的补码是00001001,-9的补码是11110111
以’-9 ^ 9’为例,9的二进制为1001。-9的补码是11110111,9的补码是00001001,^表示异或运算:两个相同的数异或后输出0,两个不同的数异或后输出1。
11110111
00001001
11111110
也就是-9 ^ 9的最后结果的是11111110,但是这是补码的形式,所以还需要把补码先转为原码。补码转原码的规律依然是:符号位不变,其余取反加1。所以11111110补码的原码是10000001+1=10000010(二进制加法)。然后再将原码转为十进制就是的-2,所以-9 ^ 9=-2,其余的计算方法也是一样。
#位与操作符(&)
x = np.arange(-9,9)
y = x & (x-1)
print(y)
print(y==0)
#函数实现
z = np.bitwise_and(x,(x-1)) #对应&
print(z)
print(np.equal(z,0))#对应===
[-10 -16 -8 -8 -6 -8 -4 -4 -2 0 0 0 2 0 4 4 6 0]
[False False False False False False False False False True True True
False True False False False True]
[-10 -16 -8 -8 -6 -8 -4 -4 -2 0 0 0 2 0 4 4 6 0]
[False False False False False False False False False True True True
False True False False False True]
位于的运算和^的运算类似,这里以-9 & -10<br>
-9的补码是11110111<br>
-10:原码:10001010,反码:11110101:补码:11110110<br>
为例。位与操作是只有当两个数都为1时才输出1,其余输出0。所以有<br>
11110111
11110110
11110110
11110110对应的原码为10001010,对应的十进制为-10
#移位操作符
print(1<<2)
x = np.arange(-9,9)
y = x & ((1<<2)-1)
print(x)
print(y)
#函数实现
z = np.left_shift(1,2) #对应1<<2
print(z)
print(np.bitwise_and(x, z-1)) #对应&
4
[-9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8]
[3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0]
4
[3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0]
1的二进制为0001,左移两位后变成0100,十进制为4。而将2的幂次减去1会变成一个全1的二进制数,如4的二进制为0100,减1变为11。对全1的二进制进行与(&)操作可以得到以2为幂数作为模的余数,也就是说与11进行&操作,就会得到以4为模的余数。同理。对111进行&操作,就会得到以8为模的余数。对于-9对4取余,余数一般取正数,所以,-9÷4 = -3…3