Python 对2D numpy数组进行切片、索引和迭代

Python 对2D numpy数组进行切片、索引和迭代,python,arrays,numpy,Python,Arrays,Numpy,我在我的大学里参加了Python初级班。我们有一个编程任务,我一直在做 我们得到了一个任务,在地图的两点之间找到一条路线,地图是一个2D numpy数组。 第一个任务之一是将由自由道路(1)和建筑(0)组成的阵列转换为阵列,其中建筑周围的所有位置(左、右、下、上)都转换为停车位(-1) 我首先编写了一个函数来生成大小合适的2D numpy数组: def get_map(): map = np.random.randint(2, size=(12, 10)) return ma

我在我的大学里参加了Python初级班。我们有一个编程任务,我一直在做

我们得到了一个任务,在地图的两点之间找到一条路线,地图是一个2D numpy数组。 第一个任务之一是将由自由道路(1)和建筑(0)组成的阵列转换为阵列,其中建筑周围的所有位置(左、右、下、上)都转换为停车位(-1)

我首先编写了一个函数来生成大小合适的2D numpy数组:

def get_map():

    map = np.random.randint(2, size=(12, 10))

    return map
现在,我想编写另一个函数,将map作为参数,并返回停车位从1转换为-1的map

def adjusted_map(map): 

    map_adjusted = 

    return map_adjusted
我大部分时间都停留在0以上和0以下的元素上。左和右我都能做到,因为这和1D数组、普通列表、字符串等没有什么不同。
如果这是一个愚蠢的问题,我很抱歉,但是我查阅了numpy文档中关于索引、切片和迭代numpy数组的内容,但是我找不到解决问题的方法

所以你需要这样的东西:

import numpy as np

mapper = np.random.randint(2, size=(12, 10))
buildings = np.nonzero(mapper)

nonzero_row = buildings[0]
nonzero_col = buildings[1]

for row, col in zip(nonzero_row, nonzero_col):
    if row > 0:
        mapper[row-1, col] = -1
    if col > 0:
        mapper[row, col-1] = -1
    if row < mapper.shape[0]:
        mapper[row+1,col] = -1
    if col < mapper.shape[1]:
        mapper[row,col+1] = -1
将numpy导入为np
mapper=np.random.randint(2,size=(12,10))
建筑物=np.非零(映射器)
非零行=建筑物[0]
非零列=建筑物[1]
对于行,列在zip中(非零行,非零列):
如果行>0:
映射器[行1,列]=-1
如果列>0:
映射器[行,列-1]=-1
如果行
以下是使用标准numpy技术的一种简单方法:

1) 制作一张由3个街区组成的地图,其中80%为道路

>>> map_ = np.kron(np.random.random((6, 5)) < 0.8, np.ones((3, 3), int))
>>> map_
array([[1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1],
       [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1],
       [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1],
       [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0]])
3) 剪切反转贴图的移位版本(上、下、左、右),使用(按位)
查找建筑物的所有邻居,使用
仅保留道路上的邻居

>>> parking = map_ & (helper[2:, 1:-1] | helper[:-2, 1:-1] | helper[1:-1, 2:] | helper[1:-1, :-2])
>>> parking
array([[0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0],
       [1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
       [1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1],
       [0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0],
       [0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0],
       [0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0]])
4) 在地图上标出停车位

>>> result = map_ - 2*parking
>>> result
array([[ 1,  1, -1,  0,  0,  0,  0,  0,  0, -1,  1,  1,  1,  1,  1],
       [ 1,  1, -1,  0,  0,  0,  0,  0,  0, -1,  1,  1,  1,  1,  1],
       [ 1,  1, -1,  0,  0,  0,  0,  0,  0, -1,  1,  1,  1,  1,  1],
       [ 1,  1, -1,  0,  0,  0, -1, -1, -1,  1,  1,  1,  1,  1,  1],
       [ 1,  1, -1,  0,  0,  0, -1,  1,  1,  1,  1,  1,  1,  1,  1],
       [-1, -1, -1,  0,  0,  0, -1, -1, -1,  1,  1,  1,  1,  1,  1],
       [ 0,  0,  0, -1, -1, -1,  0,  0,  0, -1,  1,  1,  1,  1,  1],
       [ 0,  0,  0, -1,  1, -1,  0,  0,  0, -1,  1,  1,  1,  1,  1],
       [ 0,  0,  0, -1,  1, -1,  0,  0,  0, -1,  1,  1,  1,  1,  1],
       [ 0,  0,  0, -1,  1,  1, -1, -1, -1,  1,  1,  1,  1,  1,  1],
       [ 0,  0,  0, -1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1],
       [ 0,  0,  0, -1,  1,  1, -1, -1, -1,  1,  1,  1,  1,  1,  1],
       [-1, -1, -1,  1,  1, -1,  0,  0,  0, -1,  1,  1,  1,  1,  1],
       [ 1,  1,  1,  1,  1, -1,  0,  0,  0, -1,  1,  1,  1,  1,  1],
       [-1, -1, -1,  1,  1, -1,  0,  0,  0, -1,  1,  1, -1, -1, -1],
       [ 0,  0,  0, -1,  1, -1,  0,  0,  0, -1,  1, -1,  0,  0,  0],
       [ 0,  0,  0, -1,  1, -1,  0,  0,  0, -1,  1, -1,  0,  0,  0],
       [ 0,  0,  0, -1,  1, -1,  0,  0,  0, -1,  1, -1,  0,  0,  0]])
5) 奖励:美化

>>> symbols = np.array(('x', '.', 'P'))
>>> rowtype = f'U{map_.shape[1]}'
>>> rowtype
'U15'
>>> print('\n'.join(symbols[map_].view(rowtype).ravel()))
...xxxxxx......
...xxxxxx......
...xxxxxx......
...xxx.........
...xxx.........
...xxx.........
xxx...xxx......
xxx...xxx......
xxx...xxx......
xxx............
xxx............
xxx............
......xxx......
......xxx......
......xxx......
xxx...xxx...xxx
xxx...xxx...xxx
xxx...xxx...xxx
>>> print('\n'.join(symbols[result].view(rowtype).ravel()))
..PxxxxxxP.....
..PxxxxxxP.....
..PxxxxxxP.....
..PxxxPPP......
..PxxxP........
PPPxxxPPP......
xxxPPPxxxP.....
xxxP.PxxxP.....
xxxP.PxxxP.....
xxxP..PPP......
xxxP...........
xxxP..PPP......
PPP..PxxxP.....
.....PxxxP.....
PPP..PxxxP..PPP
xxxP.PxxxP.Pxxx
xxxP.PxxxP.Pxxx
xxxP.PxxxP.Pxxx

因此,您需要找到零,然后将4个相邻位置标记为-1?是的,如果元素为零,则从零开始的元素、从零开始的元素、从零开始的元素、从零开始的元素、从零开始的元素、从零开始的元素、从零开始的元素和从零开始的元素都应更改为-1。但只有在这些元素为1的情况下。如果元素也是一个零,它应该保持为零,因为这表示两座建筑相邻。好的,第一步是找到所有的索引,其中值为1,第二步是2,使所有的邻居都为1。我得到了糟糕的结果,因为你有一个随机设置,但这在技术上是你需要的。下次发布问题时,请提供所需的输出,否则找出答案会比需要的更难:)谢谢你回答我的问题,谢谢你的建议,下次我会在问题中输入所需的输出。我运行时,您的代码不起作用,但我会研究它,以找到需要调整的内容。所以我不确定你想要什么mean@Yuca我认为理解它的最好方法是查看移位位
helper[2:,1:-1]
等。理想情况下,它们彼此相邻,并且是整个非切片
helper
。请尝试这个,如果之后仍然有问题,请随时再问我。不得不说,这没有帮助,让我想出一个方法向你提出正确的问题you@Yuca哦,对不起。好的,如果你能说得更具体一点,那会有帮助,但是让我试试:例如
helper[2:,1:-1]
这与
map\uu
的形状相同。它标记了建筑物的上部邻居,即,它在
map\uu
中下面的单元格具有
0
的任何位置都具有
1
。通过
将四个移位的
助手
s组合在一起,我们得到了建筑物的所有(上下左右)邻居。这仍然包括正在建设自己的邻居。要丢弃它们,我们使用原始的
地图
。好的,这样更容易掌握。谢谢你的耐心!谢谢你的回答。你能解释一下为什么要使用3x3街区以及80%是道路的情况吗?我不知道我是否可以在作业中设置这样的条件。我认为我的地图应该是完全随机的。
>>> symbols = np.array(('x', '.', 'P'))
>>> rowtype = f'U{map_.shape[1]}'
>>> rowtype
'U15'
>>> print('\n'.join(symbols[map_].view(rowtype).ravel()))
...xxxxxx......
...xxxxxx......
...xxxxxx......
...xxx.........
...xxx.........
...xxx.........
xxx...xxx......
xxx...xxx......
xxx...xxx......
xxx............
xxx............
xxx............
......xxx......
......xxx......
......xxx......
xxx...xxx...xxx
xxx...xxx...xxx
xxx...xxx...xxx
>>> print('\n'.join(symbols[result].view(rowtype).ravel()))
..PxxxxxxP.....
..PxxxxxxP.....
..PxxxxxxP.....
..PxxxPPP......
..PxxxP........
PPPxxxPPP......
xxxPPPxxxP.....
xxxP.PxxxP.....
xxxP.PxxxP.....
xxxP..PPP......
xxxP...........
xxxP..PPP......
PPP..PxxxP.....
.....PxxxP.....
PPP..PxxxP..PPP
xxxP.PxxxP.Pxxx
xxxP.PxxxP.Pxxx
xxxP.PxxxP.Pxxx