In [208]: alist = [(2, 13), (48, 59), (120, 131)]
r_ 使用索引表示法将切片列表转换为索引(它实际上是具有__getitem__ 方法的类实例。解释器将n:m 转换为slice(n,m),但r_ 然后将其转换为arange(n,m).
In [209]: np.r_[2:13, 48:59, 120:131]
Out[209]:
array([ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 48, 49,
50, 51, 52, 53, 54, 55, 56, 57, 58, 120, 121, 122, 123,
124, 125, 126, 127, 128, 129, 130])
s_ 可以使用相同的输入,但会生成切片对象:
In [211]: np.s_[2:13, 48:59, 120:131]
Out[211]: (slice(2, 13, None), slice(48, 59, None), slice(120, 131, None))
与(并具有相同的迭代)相同:
In [212]: [slice(i,j) for i,j in alist]
Out[212]: [slice(2, 13, None), slice(48, 59, None), slice(120, 131, None)]
用arange替换slice:
In [213]: [np.arange(i,j) for i,j in alist]
Out[213]:
[array([ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),
array([48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58]),
array([120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130])]
加入它们会产生与r_相同的结果:
In [214]: np.hstack(_)
Out[214]:
array([ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 48, 49,
50, 51, 52, 53, 54, 55, 56, 57, 58, 120, 121, 122, 123,
124, 125, 126, 127, 128, 129, 130])
r_ 很漂亮,但在计算上却是一样的。像这样的列表理解并没有什么不优雅或不符合 Python 的地方。
由于每个范围的长度相同(11 个值),我们也可以使用linspace:
In [220]: np.linspace((2,48,120),(13,59,131),11,endpoint=False, dtype=int)
Out[220]:
array([[ 2, 48, 120],
[ 3, 49, 121],
[ 4, 50, 122],
[ 5, 51, 123],
[ 6, 52, 124],
[ 7, 53, 125],
[ 8, 54, 126],
[ 9, 55, 127],
[ 10, 56, 128],
[ 11, 57, 129],
[ 12, 58, 130]])
In [221]: np.hstack(_.T)
Out[221]:
array([ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 48, 49,
50, 51, 52, 53, 54, 55, 56, 57, 58, 120, 121, 122, 123,
124, 125, 126, 127, 128, 129, 130])
您仍然可以使用r_ 和alist(但使用arange 更直接):
In [225]: np.r_.__getitem__(tuple([slice(i,j) for i,j in alist]))
Out[225]:
array([ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 48, 49,
50, 51, 52, 53, 54, 55, 56, 57, 58, 120, 121, 122, 123,
124, 125, 126, 127, 128, 129, 130])
np.r_ 只是伪装成索引的concatenate(添加了一些铃声):
np.r_[tuple([np.arange(i,j) for i,j in alist])]
np.hstack([np.arange(i,j) for i,j in alist])