python从数组中提取元素

时间:2017-05-22 02:56:35

标签: python numpy

我有一个8000元素的1D阵列。

我想获得以下两个数组:

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

  2. train应包含其他所有内容。

  3. 我该怎么做?

    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]
    

5 个答案:

答案 0 :(得分:3)

根据您的示例,一个简单的解决方法是:

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

答案 1 :(得分:2)

我看起来你正在寻找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检查条件是true还是false,并返回二进制array(实际上是数组的元组),一旦我们有二进制数组,我们可以根据原始数组索引在那。

答案 2 :(得分:2)

如果需要,可以使用面具

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)]

答案 3 :(得分:2)

构建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

答案 4 :(得分: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]