Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的数组作为索引_Python_Arrays_Matlab_Indexing - Fatal编程技术网

Python中的数组作为索引

Python中的数组作为索引,python,arrays,matlab,indexing,Python,Arrays,Matlab,Indexing,我试图使用一个具有二进制值的数组掩码来修改另一个数组数据,以便只保留掩码等于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中实现这一点的等效操作是什么?这就是我得到的。然而,如果您想要更干净的代码,那么您可以等待一些大人物的回答: mask = [0,0,0,1,1,0,0] data = [1,2,3,

我试图使用一个具有二进制值的数组掩码来修改另一个数组数据,以便只保留掩码等于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中实现这一点的等效操作是什么?

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

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

您可以在numpy中查看,它们与您描述的完全一致

例如,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生态系统的优秀库,在某些情况下为您提供了更强大的工具

如果您想在Python中实现这一点,可以使用筛选出数据列表中的条目,这些条目在mask的相应条目中包含1。制作一个将数据和掩码组合在一起的元组列表,使用filter并使用每个元组的第一个元素来确定要保留此元组列表中的哪些元素,然后在使用完后只提取数据部分。比如:

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数组,然后使用MATLAB中的逻辑索引来获得所需的内容:

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]
如果您来自MATLAB,并且正在切换到Python,那么numpy是一个不错的选择。用于分割数组的语法和numpy数组上使用的内置函数与在MATLAB中执行相同操作的方式非常相似


祝你好运

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

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

好的,通过这种方式我可以访问正确的元素,但是如何从数据中删除这些元素?您可以将这些值写入一个新列表。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,则“仅链接”答案可能无效。确定。我将很快更新我的答案。请不要再投反对票:好的,这是迄今为止最好的解决方案!谢谢,我不明白投票结果。在Python和MATLAB之间切换的人总是问这个问题。