我碰到了一些代码,该代码以以前从未见过的方式使用模运算符。有问题的行是data_index = (data_index + 1) % len(data)
。
我不知道此代码在更新data_index
时会试图做什么:
def generate_batch(batch_size, num_skips, skip_window):
global data_index
assert batch_size % num_skips == 0
assert num_skips <= 2 * skip_window
batch = np.ndarray(shape=(batch_size), dtype=np.int32)
labels = np.ndarray(shape=(batch_size, 1), dtype=np.int32)
span = 2 * skip_window + 1 # [ skip_window target skip_window ]
buffer = collections.deque(maxlen=span)
for _ in range(span):
buffer.append(data[data_index])
# What is this doing?
data_index = (data_index + 1) % len(data)
# ... More stuff ...
答案 0 :(得分:0)
模运算符%
具有明确定义的行为。除以数字后得出余数。它以a % b
的表达式形式使用,返回值c
该定义创建了一个有趣的属性,该属性用于将问题“包装”到定义明确的范围内,该属性用于您的问题提供的代码中。有问题的代码在循环中使用此代码,以确保将data_index
包装在0
到len(data) - 1
的范围内。超出范围后,它将继续从0开始附加data[data_index]
。
这是模数循环行为的一个例子:
for i in range(10):
print(str(i) + ' % 3 =', i % 3)
哪些印刷品:
0 % 3 = 0
1 % 3 = 1
2 % 3 = 2
3 % 3 = 0
4 % 3 = 1
5 % 3 = 2
6 % 3 = 0
7 % 3 = 1
8 % 3 = 2
9 % 3 = 0