我曾经读过下面的python函数,
def f1(i, num_digits):
return np.array([i >> d & 1 for d in range(num_digits)])我不太清楚i >> d & 1的这部分是如何工作的。运行f1(2,5)将返回[0,1,0,0,0]
发布于 2016-08-14 06:40:59
此函数用于创建一个列表,其中包含向右移位index次数后的最后一位i。
听起来很神秘?它是。
下面是发生的情况:
列表理解创建一个大小为num_digits-1的列表,使用范围表达式(从0到num_digits-1)的值来计算应该位于该列表索引处的项目的值。为了计算列表项的值,取整数i,并将其位右移d位,其中d是我们迭代构建列表的范围的当前值。>> (向右移位)运算符的优先级高于&运算符,因此首先执行此计算。计算列表值的最后一步是执行位移值和值1的逻辑&。这一步需要一些思考,但它所做的是返回位移值的最后一位。
如果你真的在一张纸上做这些步骤,这会更容易。请看,如果我们将2的位值向右移位一位(因此索引1处的列表条目是1,其余的是0),我们的计算的最后一位是1:
Index 0: 2 (dec) = 10 (bin) -> >> 0 -> 10 (bin) -> 10 & 01 = 00 (bin) = 0 (dec)
Index 1: 2 (dec) = 10 (bin) -> >> 1 -> 01 (bin) -> 01 & 01 = 01 (bin) = 1 (dec)
Index 2: 2 (dec) = 10 (bin) -> >> 2 -> 00 (bin) -> 00 & 01 = 00 (bin) = 0 (dec)
# From here on it will be the same as index 2, because we are only shifting 0's我希望这能帮助您理解正在发生的事情。
发布于 2016-08-14 07:18:49
numpy让我们在一个漂亮的表格中演示这一操作:
In [1633]: np.arange(10)[:,None]>>np.arange(5)
Out[1633]:
array([[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[2, 1, 0, 0, 0],
[3, 1, 0, 0, 0],
[4, 2, 1, 0, 0],
[5, 2, 1, 0, 0],
[6, 3, 1, 0, 0],
[7, 3, 1, 0, 0],
[8, 4, 2, 1, 0],
[9, 4, 2, 1, 0]], dtype=int32)看起来& 1将其转换为二进制数字表示:
In [1634]: np.arange(10)[:,None]>>np.arange(5) & 1
Out[1634]:
array([[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[1, 0, 1, 0, 0],
[0, 1, 1, 0, 0],
[1, 1, 1, 0, 0],
[0, 0, 0, 1, 0],
[1, 0, 0, 1, 0]], dtype=int32)比特移位实际上是被2的幂除
In [1641]: np.arange(10)[:,None]//(2**np.arange(5))
Out[1641]:
array([[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[2, 1, 0, 0, 0],
[3, 1, 0, 0, 0],
[4, 2, 1, 0, 0],
[5, 2, 1, 0, 0],
[6, 3, 1, 0, 0],
[7, 3, 1, 0, 0],
[8, 4, 2, 1, 0],
[9, 4, 2, 1, 0]], dtype=int32)和模2的余数:
In [1642]: np.arange(10)[:,None]//(2**np.arange(5)) % 2
Out[1642]:
array([[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[1, 0, 1, 0, 0],
[0, 1, 1, 0, 0],
[1, 1, 1, 0, 0],
[0, 0, 0, 1, 0],
[1, 0, 0, 1, 0]], dtype=int32)https://stackoverflow.com/questions/38937461
复制相似问题