我有一個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