2016-05-16 93 views
2

在Python中我會怎麼做:檢查,看是否數組元素相等

說我有:

a = [[1, 5], [2,6], [3,3], [4,2]] 
b= [[3, 1], [4,2], [1,8], [2,4]] 

現在我想做的操作與第二列的值如果第一列值匹配。

E.G.

一個具有入口[,5],現在去到b看看哦它有一個值,8],現在我要分5/8和存儲值轉換成說數組C。接下來將匹配[,6]和[,4]並獲得c:6/4中的下一個值。

這樣:

c = [5/8, 6/4, 3/1, 2/2] 

鑑於上述示例。我希望這是有道理的。想用numpy和python來做到這一點。

+2

「a」的第一列是否總是排序? 'a'中的每個第一列數字是否出現在'b'中?它們的尺寸是否相同? – kennytm

+0

@kennytm對所有人都是。 – Scientized

+0

每個列表中的第一個位置是否允許重複? –

回答

4

可以使用np.searchsorted得到其中b的第一列元素對應於a的第一列的元件,並使用該獲得除法相應的第二列元素和最後得到c的位置。因此,假設ab是NumPy的陣列,所述向量化的實施方法是 -

a0 = a[:,0] 
c = np.true_divide(a[:,1],b[np.searchsorted(a0,b[:,0],sorter=a0.argsort()),1]) 

上面列出適用於一個通用的情況下,當a第一列的元件不一定排序的方法。但是,如果他們進行排序,就像所列出的樣品的情況下,你可以簡單地忽略sorter輸入參數,並具有簡化的解決方案,像這樣 -

c = np.true_divide(a[:,1],b[np.searchsorted(a0,b[:,0]),1]) 

採樣運行 -

In [35]: a 
Out[35]: 
array([[1, 5], 
     [2, 6], 
     [3, 3], 
     [4, 2]]) 

In [36]: b 
Out[36]: 
array([[3, 1], 
     [4, 2], 
     [1, 8], 
     [2, 4]]) 

In [37]: a0 = a[:,0] 

In [38]: np.true_divide(a[:,1],b[np.searchsorted(a0,b[:,0],sorter=a0.argsort()),1]) 
Out[38]: array([ 0.625, 1.5 , 3. , 1. ]) 
1

你可以使用簡單的O(n^2)嵌套循環方式:

c = [] 

for x in a: 
for y in b: 
    if x[0] == y[0]: 
    c.append(x[1]/y[1]) 
    break 

上面的內容在列表很小時很有用。對於巨大的列表,考慮一種基於字典的方法,其中複雜性將以O(n)爲代價,但需要額外的空間。

4

考慮到所有在評論部分的假設,這將工作:

from operator import itemgetter 
from __future__ import division 

a = [[1, 5], [2,6], [3,3], [4,2]] 
b = [[3, 1], [4,2], [1,8], [2,4]] 

result = [x/y for (_, x), (_, y) in zip(a, sorted(b, key=itemgetter(0)))] 

假設:列出具有相等的長度,在第一位置元素是每個列表獨特的,第一個列表是由第一個元素進行排序,在a的第一個位置出現的每個元素也出現在b的第一個位置。

+1

這是否假設a中的每個第一列條目在b中具有對應條目? – trans1st0r

+0

可能需要一個'from __future__ import division' – Eric

+0

@ trans1st0r:是的,因爲這是_「在評論部分中的假設」_ – Eric

0

我虛心地建議你使用錯誤的數據結構。請注意,如果您的數組列具有介於1和N之間的唯一值(索引列),則只需重新排序其他列即可對相同的數據進行編碼。重新排列數據後,您不僅可以刪除「索引」列,而且現在可以更輕鬆地對剩餘數據進行操作。讓我證明:

import numpy as np 

N = 5 
a = np.array([[1, 5], [2,6], [3,3], [4,2]]) 
b = np.array([[3, 1], [4,2], [1,8], [2,4]]) 

a_trans = np.ones(N) 
a_trans[a[:, 0]] = a[:, 1] 

b_trans = np.ones(N) 
b_trans[b[:, 0]] = b[:, 1] 

c = a_trans/b_trans 
print c 

根據您的問題的性質,有時可以使用隱式指數從一開始,但是偶爾也有明確的指標是非常有用的。如果您需要明確的索引,請考慮使用類似pandas.DataFrame的索引操作更好的支持。