数组作为Python中的索引

时间:2014-11-11 17:51:24

标签: python arrays matlab indexing

我正在尝试使用具有二进制值的数组(mask)来修改另一个数组(data),以便仅保留mask等于1的值

这是我的MATLAB示例代码:

mask = [0 0 0 1 1 0 0];

data = [1 2 3 4 5 6 7];

data(mask == 0) = []

我的结果是:

data = [4 5]

在Python中完成此操作的等效操作是什么?

4 个答案:

答案 0 :(得分:1)

您可以在numpy中查看与您描述完全相同的Boolean index arrays

例如,numpy风格的代码如下:

In [38]: import numpy as np
In [39]: mask = np.array([False, False, False, True, True, False, False])
In [40]: data = np.array([1, 2, 3, 4, 5, 6, 7])
In [41]: data[mask]

Out[41]: array([4, 5])

通常,如果您希望在Python中创建类似MATLAB的环境,则应尝试同时使用numpypandasipythonmatplotlib。这些都是复制MATLAB生态系统的优秀库,在某些情况下可以为您提供更强大的工具。

答案 1 :(得分:0)

如果您希望纯粹使用Python,则可以使用filter过滤掉data列表中1的相应条目中包含mask的条目。列出将datamask组合在一起的元组列表,使用filter并使用每个元组的第一个元素来确定要保留的元组列表中的哪些元素,然后简单地提取使用map后,data部分。类似的东西:

In [1]: mask = [0,0,0,1,1,0,0]

In [2]: data = [1,2,3,4,5,6,7]

In [3]: L = [(x,y) for (x,y) in zip(mask,data)]

In [4]: F = filter(lambda z: z[0], L)

In [5]: data = map(lambda z: z[1], F)

In [5]: data
Out[5]: [4, 5]

但是,如果您希望最有效地进行逻辑索引,我会使用numpy为您执行此操作。创建numpymask的{​​{1}}数组,然后像在MATLAB中一样使用逻辑索引来获得您想要的内容:

data

如果您来自MATLAB并且正在切换到Python,In [6]: import numpy as np In [7]: L = np.array(data) In [8]: M = np.array(mask, dtype='bool') In [9]: data = list(L[M]) In [10]: data Out[10]: [4, 5] 是可行的方法。用于切片数组和numpy数组上使用的内置函数的语法非常类似于在MATLAB中执行相同操作的方式。

祝你好运!

答案 2 :(得分:0)

即使对于通用数组(表示非布尔值),也可以通过直接使用掩码作为索引来实现。

In [16]: a
Out[16]: array([1, 2])

In [17]: b
Out[17]: 
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15]])

In [18]: b[a]
Out[18]: 
array([[ 6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15]])

In [19]: b[:, a]
Out[19]: 
array([[ 2,  3],
       [ 7,  8],
       [12, 13]])

答案 3 :(得分:-1)

这就是我得到的。但是,如果你想要更干净的代码,那么你可以等待一些大人物来回答:

mask = [0,0,0,1,1,0,0]
data = [1,2,3,4,5,6,7]

for index, one in enumerate(mask):
    if one == 1:
        print data[index],
print

输出: 4,5