Python 如何获取条件所在的2d数组子部分的开始和结束
给定一个由1和0组成的二维数组,我需要得到1所在分区的坐标。例如,给定以下定义的数组: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,
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))