2017-03-07 28 views
4

我有座標的陣列是這樣的:分割陣列依賴於數組值在Python

array = [[1,6],[2,6],[3,8],[4,10],[5,6],[5,7],[18,6],[19,5],[17,9],[10,5]] 

6之間的陣列分開。和7。座標,因爲那裏的值爲X。我想獲得兩個獨立陣列,分別爲arr1arr2,其中arr1是拆分前的值,而arr2是後面的值。

我想說的是,如果下一個X值大於10相差較大,將追加到arr2,否則arr1,這樣的事情:

arr1 = [] 
arr2 = [] 
for [x,y] in array: 
    if next(x) > 10: 
     arr2.append(x,y) 
    else: 
     arr1.append(x,y) 

是否有人可以幫我解決這個問題?

+0

的'> 10 :'是一個硬編碼的嘗試,那麼編號'10'不相關,只有連續性分裂?那麼[5,6],[5,7]'怎麼樣,這個也應該忽略呢? – roganjosh

+0

此外,你的附加應該看起來像'arr1.append([x,y])'與您的原始列表一致 – Priyank

+0

實際上我不清楚爲什麼這隻會導致來自示例輸入的兩個數組,拆分似乎是任意的 – roganjosh

回答

1

你可以做到以下幾點:

ar = np.array([[1,6],[2,6],[3,8],[4,10],[5,6],[5,7],[18,6],[19,5],[17,9],[10,5]]) 

# get differences of x values 
dif = ar[1:, 0] - ar[:-1, 0] 

# get the index where you first observe a jump 
fi = np.where(abs(dif) > 10)[0][0] 

ar1 = ar[:fi+1] 
ar2 = ar[fi+1:] 

然後dif是:

array([ 1, 1, 1, 1, 0, 13, 1, -2, -7]) 

fi是5和ar1ar2是:

array([[ 1, 6], 
     [ 2, 6], 
     [ 3, 8], 
     [ 4, 10], 
     [ 5, 6], 
     [ 5, 7]]) 

array([[18, 6], 
     [19, 5], 
     [17, 9], 
     [10, 5]]), 

這也將讓你得到你的數據的所有跳躍(你只需要改變fi = np.where(abs(dif) > 10)[0][0]fi = np.where(abs(dif) > 10)[0]

-1

試試這個:

prev = array[0][0]
pos = -1
for i in range (1, len(array)):
if array[i][0] - prev >1:
break
else:
prev = array[i][0]
if pos != -1:
arr1 = array[:pos]
arr2 = array[pos:]

這應該拆分array你想要的方式。需要注意的是列表是從0

+0

這不是一個答案。 –

+0

感謝您的迴應!我應該提到數組的大小可能會發生變化,但是X值總是會有差距。這就是爲什麼我想要一個方法來拆分X值的依賴。 – agrom

+0

這應該找出數組中x值不連續的第一位。謝謝! @Rohan Sadale – Priyank

2

索引這可能是你在找什麼

array = [[1,6],[2,6],[3,8],[4,10],[5,6],[5,7],[18,6],[19,5],[17,9],[10,5]] 
# Declare two array variables 
arr1 = None 
arr2 = None 
n = len(array) 
for i in range(n-1): 
    if abs(array[i][0] - array[i+1][0]) >= 10: 
     arr1 = array[:i+1] 
     arr2 = array[i+1:] 
     break 

print arr1 
print arr2 
+0

對Y值怎麼做?如果abs(array [0] [i] - array [0] [i + 1])變爲abs(array [i] [0] - array [i + 1] [0])> = 10: )> = 10:'只返回IndexError:列表索引超出範圍' – agrom

+0

由於'for'循環的範圍取決於'array'中元素的數量,所以應該返回'超出範圍錯誤'。如果你想處理Y值,你可以編寫一個內循環。 –

0
arry1 = [] 
arry2 = [] 
for i in arry: 
    if (i[0] - i[1]) > 10: 
     arry1.append(i) 
    else: 
     arry2.append(i) 
+0

使用評論,而不是回答 – Dmitry

+1

儘管此代碼可能會回答問題,但提供有關如何解決問題和/或爲何解決問題的其他上下文將提高​​答案的長期價值。 –

2

如果我得到正確你的問題,你想數組在第一點裏劈隨後的兩個x值之間的差值大於10 你可以做,使用numpy的:

import numpy as np 
THRESH = 10 
array = [[1,6],[2,6],[3,8],[4,10],[5,6],[5,7],[18,6],[19,5],[17,9],[10,5]] 
array = np.asarray(array) 
deltas_x = np.abs(array[1:,0] - array[:-1,0]) 
split_idx = np.where(deltas_x > THRESH)[0][0] + 1 
arr1 = array[:split_idx,:] 
arr2 = array[split_idx:,:] 

需要注意的是,我們需要加1 np.where的結果佔發克拉該deltas_x陣列是1個值大於array

1

可能最容易在連續對與分割只要間隙被發現迭代較短:

array = [[1,6],[2,6],[3,8],[4,10],[5,6],[5,7],[18,6],[19,5],[17,9],[10,5]] 

for idx, (cur, nxt) in enumerate(zip(array, array[1:])): # successive pairs and index 
    if abs(cur[0] - nxt[0]) > 10: # compare difference of first items 
     arr1, arr2 = array[:idx+1], array[idx+1:] # split 
     break # no further splits, end the loop now 
else: # no break, keep the original array 
    arr1, arr2 = array, [] 

其中給出:

>>> arr1 
[[1, 6], [2, 6], [3, 8], [4, 10], [5, 6], [5, 7]] 
>>> arr2 
[[18, 6], [19, 5], [17, 9], [10, 5]] 

它如果你想分幾次就會有點困難,但這應該適用於你的情況。

1

當比較連續元素我通常使用枚舉:

array = [[1,6],[2,6],[3,8],[4,10],[5,6],[5,7],[18,6],[19,5],[17,9],[10,5]] 
arr1 = list() 
arr2 = list() 
gap = 10 

for index, value in enumerate(array[:-1]): # [:-1] prevents out of range 
    if abs(value[0]-array[index+1][0]) >= gap: 
     arr1.append(value) 
    else: 
     arr2.append(value) 

arr2.append(array[-1]) # Take into account that the last element needs to be added to one of the arrays.