Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获取条件所在的2d数组子部分的开始和结束_Python_Numpy_Matrix_Multidimensional Array - Fatal编程技术网

Python 如何获取条件所在的2d数组子部分的开始和结束

Python 如何获取条件所在的2d数组子部分的开始和结束,python,numpy,matrix,multidimensional-array,Python,Numpy,Matrix,Multidimensional Array,给定一个由1和0组成的二维数组,我需要得到1所在分区的坐标。例如,给定以下定义的数组: a = [[0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0]] 我的函数应该返回开始,其中1s小节开始为(1,1),结束,其中1s小节结束为(2,2) 有没有比使用numpy实现for循环更有效的方法?我添加了另一行进行验证: a = [[0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0,

给定一个由1和0组成的二维数组,我需要得到1所在分区的坐标。例如,给定以下定义的数组:

a = [[0, 0, 0, 0],
     [0, 1, 0, 0],
     [0, 0, 1, 0]]
我的函数应该返回开始,其中1s小节开始为(1,1),结束,其中1s小节结束为(2,2)


有没有比使用numpy实现for循环更有效的方法?

我添加了另一行进行验证:

a = [[0, 0, 0, 0],
     [0, 1, 0, 0],
     [0, 0, 1, 0],
     [0, 0, 0, 1]]
你可以做:

results_list = list()
for i, v in enumerate(a):
    if 1 in v:
        results_list.append([i, v.index(1)])
然后,对于第一个和最后一个值:

results_list[0] # [1, 1]

results_list[-1] # [3, 3]
或者,一下子:

results_list= list()
while True:
    for i, v in enumerate(a):
        if 1 in v:
            results_list.append([i, v.index(1)])
    # Set firs and last locations to variables for use somewhere else.
    first_pair, last_pair = results_list[0], results_list[-1]
    break
输出:

In [0]: print(f"First pair: {first_pair}\nLast pair: {last_pair}")

Out [0]: 
First pair: [1, 1]
Last pair: [3, 3]

可以使用numpy
nonzero()
方法获取索引为非零的行、列对列表。然后你可以得到这些指数的最小最大值

ys, xs = np.array(a).nonzero()
min_point = (ys[0], xs[0])
max_point = (ys[-1], xs[-1])
灵感来源于,这里有一个方法-

def start_end(a):
    m,n = a.shape
    mask = a.astype(bool)

    rowm = mask.any(1)
    colm = mask.any(0)

    r0 = rowm.argmax()
    c0 = colm.argmax()

    r1 = m-rowm[::-1].argmax()-1
    c1 = n-colm[::-1].argmax()-1
    return (r0,c0), (r1,c1)
样本运行-

In [114]: a # bit more generic case
Out[114]: 
array([[0, 1, 0, 0],
       [0, 1, 0, 0],
       [0, 0, 1, 1]])

In [115]: start_end(a)
Out[115]: ((0, 1), (2, 3))