我正在尝试使用具有二进制值的数组(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中完成此操作的等效操作是什么?
答案 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的环境,则应尝试同时使用numpy
,pandas
,ipython
和matplotlib
。这些都是复制MATLAB生态系统的优秀库,在某些情况下可以为您提供更强大的工具。
答案 1 :(得分:0)
如果您希望纯粹使用Python,则可以使用filter
过滤掉data
列表中1
的相应条目中包含mask
的条目。列出将data
和mask
组合在一起的元组列表,使用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
为您执行此操作。创建numpy
和mask
的{{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