2017-05-22 131 views
2

我有一個8000元素的1D數組。python從數組中提取元素

欲獲得以下兩個數組:

  1. test包含有從[1995:1999][3995:3999][5999:5999][7995:7999]索引的元素。

  2. train應該包含一切。

我應該怎麼做?


idx = [1995,1996,1997,1998, 1999, 3995, 3996, 3997,3998, 3999, 5995, 5996, 5997, 5998, 5999, 7995, 7996, 7997, 7998, 7999] 
test = [X[i] for i in idx] 

train = [X[i] for i **not** in idx] 
+0

查找到'vstack'從numpy的。你試過什麼了? –

+0

有沒有在Python中的命令? – wrek

+0

你是什麼意思? –

回答

2

根據您的例子,一個簡單的解決方法是這樣的:

train = [X[i] for i, _ in enumerate(X) if i not in idx] 
1

這是一種可能性,假設array是含8000元列表的名稱:

idx = {1995, 1996, 1997, 1998, 1999, 3995, 3996, 3997, 3998, 3999, 5995, 5996, 5997, 5998, 5999, 7995, 7996, 7997, 7998, 7999} 

test = [array[x] for x in idx] 

train = [x for i, x in enumerate(array) if i not in idx] 
1

我看起來像你正在尋找numpy.where,這裏是一個簡單的例子得到你開始:

In [18]: import numpy as np 

In [19]: a = np.array([[0,3],[1,2],[2,3],[3,2],[4,5],[5,1]]) 

In [20]: a[np.where((a[:, 0] > 1) & (a[:, 0] < 5))[0]] 
Out[20]: 
array([[2, 3], 
     [3, 2], 
     [4, 5]]) 

In [21]: a[np.where(~((a[:, 0] > 1) & (a[:, 0] < 5)))[0]] 
Out[21]: 
array([[0, 3], 
     [1, 2], 
     [5, 1]]) 

行的第一個元素可以是你的索引,第二你的價值。 numpy.where檢查條件是否爲truefalse,並返回二進制array(實際上是數組的元組),一旦我們有了二進制數組,我們就可以基於這個數組索引原始數組。

1

如果你願意,你可以使用口罩

mask = np.ones(len(X), dtype=bool) 
mask[idx] = False 
train = X[mask] 
test = X[idx] 

# you can also use this for test 
test = X[np.logical_not(mask)] 
+0

它應該是'mask'。你否定了布爾的面具。 idx是整數類型。 –

1

當建立train,你需要通過所有的源數據進行迭代。

使用enumerate應該讓事情變得簡單:

>>> data = list(range(8000)) 
>>> train, test = [], [] 
>>> for i, value in enumerate(data): 
...  if 1995 <= i <= 1999 or 3995 <= i <= 3999 or 5995 <= i <= 5999 or 7995 <= i <= 7999: 
...   test.append(value) 
...  else: 
...   train.append(value) 
... 
>>> test 
[1995, 1996, 1997, 1998, 1999, 3995, 3996, 3997, 3998, 3999, 5995, 5996, 5997, 5998, 5999, 7995, 7996, 7997, 7998, 7999] 
>>> len(train) 
7980