我想得到numpy数组中某个元素的邻居.让我们考虑以下示例
a = numpy.array([0,1,2,3,4,5,6,7,8,9])
Run Code Online (Sandbox Code Playgroud)
所以我想指定位置5,并希望从双方获得三个邻居.可以办到
index = 5
num_neighbor=3
left = a[index-num_neighbor:index]
right= a[num_neighbor+1:num_neighbor+index+1]
Run Code Online (Sandbox Code Playgroud)
上面的代码没有处理边界...我希望我得到数组边界内的邻居.为此,请考虑以下示例,如果index为1,则左邻居只有一个元素为0.
非常感谢
import numpy as np
a = np.array([0,1,2,3,4,5,6,7,8,9])
num_neighbor=3
for index in range(len(a)):
left = a[:index][-num_neighbor:]
right= a[index+1:num_neighbor+index+1]
print(index,left,right)
Run Code Online (Sandbox Code Playgroud)
产量
(0, array([], dtype=int32), array([1, 2, 3]))
(1, array([0]), array([2, 3, 4]))
(2, array([0, 1]), array([3, 4, 5]))
(3, array([0, 1, 2]), array([4, 5, 6]))
(4, array([1, 2, 3]), array([5, 6, 7]))
(5, array([2, 3, 4]), array([6, 7, 8]))
(6, array([3, 4, 5]), array([7, 8, 9]))
(7, array([4, 5, 6]), array([8, 9]))
(8, array([5, 6, 7]), array([9]))
(9, array([6, 7, 8]), array([], dtype=int32))
Run Code Online (Sandbox Code Playgroud)
之所以a[index-num_neighbor:index]不起作用,index<num_neighbor是因为切片规则 #3 和 #4:
鉴于s[i:j]:
如果 i 或 j 为负数,则索引相对于字符串末尾: len(s) + i 或 len(s) + j 被替换。
s 从 i 到 j 的切片定义为索引为 k 且 i <= k < j 的项目序列。如果 i 或 j 大于 len(s),则使用 len(s)。如果省略 i 或 None,则使用 0。如果省略 j 或 None,则使用 len(s)。如果 i 大于或等于 j,则切片为空。
那么什么时候index=1,然后a[index-num_neighbor:index] = a[-2:1] = a[10-2:1] = a[8:1] = []。