查找数组中的节点

时间:2019-02-14 12:45:41

标签: python arrays python-3.x numpy numpy-ndarray

我想找到1个节点之间的8个节点

4 个答案:

答案 0 :(得分:1)

尝试一下:

def neighbours(grid, i, j):
    rows = np.array([-1, -1, -1,  0,  0,  1,  1,  1])
    cols = np.array([-1,  0,  1, -1,  1, -1,  0,  1])
    return grid[rows+i,cols+j]

编辑:示例

grid = np.arange(25).reshape((5,5))
#array([[ 0,  1,  2,  3,  4],
#       [ 5,  6,  7,  8,  9],
#       [10, 11, 12, 13, 14],
#       [15, 16, 17, 18, 19],
#       [20, 21, 22, 23, 24]])

neighbours(grid, 0, 0)
# array([24, 20, 21,  4,  1,  9,  5,  6])

说明

通过numpy,您可以使用负索引,从而轻松访问数组的最后一个条目。这也适用于多个维度:

x = np.array([0,1,2,3])
x[-1]
# 3

x.reshape((2,2))
#array([[0, 1],
#       [2, 3]])

x[-1,-1]
# 3

您对矩阵的8个条目感兴趣。

  1. 左上方->行-1,列-1
  2. 上方->行-1,列+ 0
  3. 在上方->行-1,列+ 1
  4. 左->行+ 0,列-1
  5. ...

这就是数组rowscols所表示的。通过添加ij,您可以获得围绕这些坐标的所有条目。

答案 1 :(得分:0)

您搜索这样的内容吗?

def neighbour(grid, i, j):
    return np.delete((grid[i-1:i+2,j-1:j+2]).reshape(1,9),4)

# Test code
grid = np.arange(16).reshape(4,4)

b = neighbour(m, 2, 2)

答案 2 :(得分:0)

尝试一下。

y=[]
l= len(x)
for i in range(0,l):
    for j in range(0,l):
        if i==int(l/2) and j==int(l/2):
            continue
        y.append(x[j,i])

答案 3 :(得分:0)

使用ndimage.generic_filter的某些黑客行为:

from scipy import ndimage

def get_neighbors(arr):
    output = []
    def f(x):
        output.append(x)
        return 0

    t = tuple(int((x - 1) / 2) for x in arr.shape)
    footprint = np.ones_like(arr)
    footprint[t] = 0
    ndimage.generic_filter(arr, f, footprint=footprint, mode='wrap')
    return np.array(output)

arr = np.arange(9).reshape(3, 3)
neighbors = get_neighbors(arr)
neighbors_grid = neighbors.reshape(*arr.shape, -1)

print(neighbors)
print(neighbors_grid)

哪些印刷品:

# neighbors
[[8. 6. 7. 2. 1. 5. 3. 4.]
 [6. 7. 8. 0. 2. 3. 4. 5.]
 [7. 8. 6. 1. 0. 4. 5. 3.]
 [2. 0. 1. 5. 4. 8. 6. 7.]
 [0. 1. 2. 3. 5. 6. 7. 8.]
 [1. 2. 0. 4. 3. 7. 8. 6.]
 [5. 3. 4. 8. 7. 2. 0. 1.]
 [3. 4. 5. 6. 8. 0. 1. 2.]
 [4. 5. 3. 7. 6. 1. 2. 0.]]

# neighbors_grid
[[[8. 6. 7. 2. 1. 5. 3. 4.]
  [6. 7. 8. 0. 2. 3. 4. 5.]
  [7. 8. 6. 1. 0. 4. 5. 3.]]

 [[2. 0. 1. 5. 4. 8. 6. 7.]
  [0. 1. 2. 3. 5. 6. 7. 8.]
  [1. 2. 0. 4. 3. 7. 8. 6.]]

 [[5. 3. 4. 8. 7. 2. 0. 1.]
  [3. 4. 5. 6. 8. 0. 1. 2.]
  [4. 5. 3. 7. 6. 1. 2. 0.]]]

如果您只想填充数组:

padded = np.pad(arr, pad_width=1, mode='wrap')
print(padded)

当然可以给出:

[[8 6 7 8 6]
 [2 0 1 2 0]
 [5 3 4 5 3]
 [8 6 7 8 6]
 [2 0 1 2 0]]