你如何得到一个步骤的Numpy切片的索引?

时间:2017-11-10 11:01:21

标签: python numpy

原始问题(有愚蠢的例子):例如我的问题很简单,你如何在Numpy中获得带有step的切片的索引位置。请参阅下面的示例,您可以在切片上使用np.nonzero但包含一个步骤而不是。还有其他选择

import numpy as np
d = np.hstack([np.arange(6), np.arange(6), np.arange(6)])
step = 6

np.nonzero(d[0:-1])
Out[45]: (array([ 1,  2,  3,  4,  5,  7,  8,  9, 10, 11, 13, 14, 15, 16]),)

In [46]: np.nonzero(d[0:-1:step])
Out[46]: (array([], dtype=int64),)
`

我应该问过这个问题。

如何通过Numpy中的步骤获得切片的索引。 例如

import numpy as np
d = np.hstack([np.arange(6), np.arange(6), np.arange(6)])
step = 6

#The indices of d[0:-1:step] would be:
array([ 0,  6, 12])

2 个答案:

答案 0 :(得分:4)

np.nonzero使用步骤arg,它只是你的步骤arg匹配没有非零值的索引:

In[59]:
d[0:-1:step]

Out[59]: array([0, 0, 0])

例如,如果您的步骤arg是5,那么它按预期工作:

In[60]:
d[0:-1:5]

Out[60]: array([0, 5, 4, 3])

In[61]:
np.nonzero(d[0:-1:5])

Out[61]: (array([1, 2, 3], dtype=int64),)

<强>更新

如果您只想要切片中的索引,那么您只需将切片应用于范围:

In[72]:
np.arange(len(d))[0:-1:step]

Out[72]: array([ 0,  6, 12])

或者只做arange并传递长度和步骤参数:

In[73]:
np.arange(0, len(d), step)

Out[73]: array([ 0,  6, 12])

更新2

感谢@Divakar(numpy master),您可以使用r_将切片表示法转换为数组,这样可以减少输入:

In[79]:
np.r_[:len(d):step]

Out[79]: array([ 0,  6, 12])

答案 1 :(得分:0)

如果您step=6 numpy array d的行为与

相同
step = 6
print((d[0:-1:step]))
output:[0 0 0]

因为

d = np.hstack([np.arange(6), np.arange(6), np.arange(6)])
print(d)
output: [0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5]

所以step=6

np.nonzero(d[0:-1:step])
output: (array([], dtype=int64),)