我有一个2D numpy数组。我正在寻找每行中特定元素首次出现的索引。输出将是一个(n x 2)数组,其中n是行数,每个条目都包含该特定元素第一次出现的x和y坐标。如何从2D numpy数组中的每一行获取第一个元素?
非常感谢。
我有一个2D numpy数组。我正在寻找每行中特定元素首次出现的索引。输出将是一个(n x 2)数组,其中n是行数,每个条目都包含该特定元素第一次出现的x和y坐标。如何从2D numpy数组中的每一行获取第一个元素?
非常感谢。
我不知道你的平均什么“S和Y坐标”,所以我假设你的意思行和列位置。
import numpy as np
np.array([(s, list(row).index(your_element)) for s,row in enumerate(your_array)])
注意它会提高ValueError
如果your_element
是不包含在某行。
以下版本会给你一个可能包含比输入少的行的输出,但对于your_element
从一行中缺失的情况不会引发ValueError
。
np.array([(s, list(row).index(your_element)) for s,row in enumerate(your_array) if your_element in row])
如果我理解正确的问题,你想是这样的:
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
>>> # 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]])
可以重新制定结果,A1,根据需要,例如,作为具有在至极相同的形状A1一个布尔阵列每个小区或者T/F根据该值是否在原始矩阵表示该值的第一次出现:
>>> 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)
是你理解正确的......我想写x和y坐标......那么,是否有任何解决方案只包含行元素退出时的第一个元素的索引 - 1?或者我们可以做任何后期处理来避免它? 谢谢 – Shan
你希望你的代码对于哪里your_element没有被包含在一行中有什么行为?你可以a)首先从输入中删除这些行b)用占位符值填充输出的y位置c)引发异常 – wim
以及输入中的行不应该被删除,因为它稍后将被用于索引。删除行也会干扰索引。输出应该像'[(row_num,col_num),(row_num,col_num),(row_num,col_num),...,(row_num,col_num)]',其中结果中的第一个元素告诉行和列第一次发现该行中的特定元素,等等......我希望现在会清楚......请让我知道是否有任何问题。谢谢 – Shan