如何从二维numpy数组中的每一行获取第一个元素?

2 投票
3 回答
2604 浏览
提问于 2025-04-17 01:45

我有一个二维的numpy数组。我想找出每一行中某个特定元素第一次出现的位置。输出结果会是一个(n x 2)的数组,其中n是行数,每个条目包含那个特定元素第一次出现的x和y坐标。

非常感谢!

3 个回答

2

如果我理解这个问题没错的话,你想要的东西大概是这样的:

import numpy as N
#
nrows=5
ncols=10 
#
a=N.random.random((nrows,ncols))
b=-99*N.ones((nrows,2))
#
for j in range(nrows):
    for i in range(ncols):
        if(a[j,i]<0.5):
            b[j,0]=i
            b[j,1]=j
            continue
2
>>> # generate some fake data:
>>> A = NP.random.randint(5, 10, 100).reshape(10, 10)
>>> A
  array([[5, 7, 8, 8, 5, 6, 6, 9, 6, 9],
        [9, 8, 8, 9, 5, 6, 6, 9, 8, 9],
        [8, 5, 6, 7, 8, 9, 5, 8, 6, 7],
        [5, 8, 8, 6, 9, 6, 8, 5, 8, 9],
        [6, 9, 8, 8, 5, 7, 6, 5, 7, 6],
        [7, 8, 6, 7, 6, 6, 7, 8, 6, 8],
        [8, 6, 8, 9, 8, 8, 9, 6, 8, 7],
        [8, 7, 8, 5, 9, 5, 7, 8, 6, 9],
        [9, 6, 5, 9, 9, 8, 8, 9, 8, 8],
        [6, 8, 5, 8, 6, 5, 8, 6, 8, 5]])

>>> # sort this 2D array along one axis (i chose row-wise)
>>> A = NP.sort(A, axis=1)
>>> A
  array([[5, 5, 6, 6, 6, 7, 8, 8, 9, 9],
         [5, 6, 6, 8, 8, 8, 9, 9, 9, 9],
         [5, 5, 6, 6, 7, 7, 8, 8, 8, 9],
         [5, 5, 6, 6, 8, 8, 8, 8, 9, 9],
         [5, 5, 6, 6, 6, 7, 7, 8, 8, 9],
         [6, 6, 6, 6, 7, 7, 7, 8, 8, 8],
         [6, 6, 7, 8, 8, 8, 8, 8, 9, 9],
         [5, 5, 6, 7, 7, 8, 8, 8, 9, 9],
         [5, 6, 8, 8, 8, 8, 9, 9, 9, 9],
         [5, 5, 5, 6, 6, 6, 8, 8, 8, 8]])

>>> # now diff the sorted array along the same axis
>>> A1 = NP.diff(A ,axis=1)

>>> # A1 contains non-zero values for "first occurrences" and
>>> # zero values for repeat values
>>> A1
  array([[0, 1, 0, 0, 1, 1, 0, 1, 0],
         [1, 0, 2, 0, 0, 1, 0, 0, 0],
         [0, 1, 0, 1, 0, 1, 0, 0, 1],
         [0, 1, 0, 2, 0, 0, 0, 1, 0],
         [0, 1, 0, 0, 1, 0, 1, 0, 1],
         [0, 0, 0, 1, 0, 0, 1, 0, 0],
         [0, 1, 1, 0, 0, 0, 0, 1, 0],
         [0, 1, 1, 0, 1, 0, 0, 1, 0],
         [1, 2, 0, 0, 0, 1, 0, 0, 0],
         [0, 0, 1, 0, 0, 2, 0, 0, 0]])
>>> ndx = A1==0
>>> ndx
  array([[ True, False,  True,  True, False, False,  True, False,  True],
         [False,  True, False,  True,  True, False,  True,  True,  True],
         [ True, False,  True, False,  True, False,  True,  True, False],
         [ True, False,  True, False,  True,  True,  True, False,  True],
         [ True, False,  True,  True, False,  True, False,  True, False],
         [ True,  True,  True, False,  True,  True, False,  True,  True],
         [ True, False, False,  True,  True,  True,  True, False,  True],
         [ True, False, False,  True, False,  True,  True, False,  True],
         [False, False,  True,  True,  True, False,  True,  True,  True],
         [ True,  True, False,  True,  True, False,  True,  True,  True]], dtype=bool)

你可以根据需要重新整理结果A1,比如把它变成一个布尔数组,这个数组的形状和A1是一样的。在这个数组中,每个单元格要么是T(真),要么是F(假),这取决于原始矩阵中的值是否是该值第一次出现。

2

我不太确定你所说的“s和y坐标”具体指什么,所以我假设你是指行和列的位置。

import numpy as np
np.array([(s, list(row).index(your_element)) for s,row in enumerate(your_array)])

请注意,如果your_element不在某一行中,会引发ValueError错误。

下面这个版本会给你一个输出,可能会比输入的行数少,但在your_element缺失的情况下,不会引发ValueError错误。

np.array([(s, list(row).index(your_element)) for s,row in enumerate(your_array) if your_element in row])

撰写回答