Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.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-如何使用其他numpy数组正确索引numpy数组,类似于MATLAB_Python_Arrays_Matlab_Numpy_Indexing - Fatal编程技术网

Python-如何使用其他numpy数组正确索引numpy数组,类似于MATLAB

Python-如何使用其他numpy数组正确索引numpy数组,类似于MATLAB,python,arrays,matlab,numpy,indexing,Python,Arrays,Matlab,Numpy,Indexing,在多年使用MATLAB之后,我正在尝试学习python,这是我一直坚持的。我有一个数组,比如说10乘8。我想在第一列中找到值为3的行,并在该行中取列“2:”。我所做的是: newArray = oldArray[np.asarray(np.where(oldArray[:,0] == 3)), 2:] 但这会创建一个一维为1的三维数组,而不是二维数组。我正在努力实现与MATLAB等效的 newArray = oldArray(find(oldArray(:,1)==3),3:end); 有人

在多年使用MATLAB之后,我正在尝试学习python,这是我一直坚持的。我有一个数组,比如说10乘8。我想在第一列中找到值为3的行,并在该行中取列“2:”。我所做的是:

newArray = oldArray[np.asarray(np.where(oldArray[:,0] == 3)), 2:]
但这会创建一个一维为1的三维数组,而不是二维数组。我正在努力实现与MATLAB等效的

newArray = oldArray(find(oldArray(:,1)==3),3:end);

有人想过怎么做吗?谢谢大家!

对第一列进行切片
并与
3
进行比较,为我们提供一个选择行的掩码。在通过索引到输入数组的
2D
数组的第一个轴/行来选择行之后,我们需要选择列(数组的第二个轴)。在MATLAB代码中,有
3:end
,这将转换为NumPy上的
2:
。在MATLAB中,需要指定结束索引,而在NumPy中则不需要。因此,与MATLAB上的
3:end
相比,它简化为
2:

因此,代码将是-

oldArray[oldArray[:,0]==3,2:]
样本运行-

In [352]: a
Out[352]:    |===============>|
array([[1, 0, 4, 2, 0, 1, 3, 2],
       [1, 0, 0, 3, 2, 3, 4, 4],
       [1, 2, 1, 4, 4, 0, 4, 2],
       [0, 2, 0, 3, 2, 2, 1, 2],
       [1, 2, 3, 3, 1, 0, 0, 1],
       [3, 4, 2, 4, 2, 0, 3, 4],  <==
       [3, 1, 1, 0, 0, 1, 2, 0],  <==
       [2, 0, 4, 3, 1, 3, 1, 1],
       [4, 3, 1, 3, 1, 3, 4, 4],
       [2, 0, 2, 0, 3, 1, 1, 1]])

In [353]: a[a[:,0]==3,2:]
Out[353]: 
array([[2, 4, 2, 0, 3, 4],
       [1, 0, 0, 1, 2, 0]])
这同样有效,但会创建问题中列出的
3D
数组

剖析它-

In [361]: np.where(a[:,0] == 3)
Out[361]: (array([5, 6]),)
我们看到
np。其中
是数组的元组,它是行和列索引。对于
1D
的切片,您不会同时拥有行和列,但是 只有一个索引数组

在MATLAB中,
find
为您提供了一个索引数组,因此可以减少混乱-

>> a
a =
     3     4     3     3
     2     5     5     2
     2     2     2     3
     5     3     4     4
     4     3     4     2
     3     2     4     2
>> find(a(:,1)==3)
ans =
     1
     6
所以,为了得到这些索引,从中得到第一个数组-

In [362]: np.where(a[:,0] == 3)[0]
Out[362]: array([5, 6])
使用它索引到第一个轴,然后从
2
开始对列进行切片-

In [363]: a[np.where(a[:,0] == 3)[0]]
Out[363]: 
array([[3, 4, 2, 4, 2, 0, 3, 4],
       [3, 1, 1, 0, 0, 1, 2, 0]])

In [364]: a[np.where(a[:,0] == 3)[0],2:]
Out[364]: 
array([[2, 4, 2, 0, 3, 4],
       [1, 0, 0, 1, 2, 0]])
这将为您提供预期的输出


注意事项

在使用掩码或整数索引轴时需要小心

理论上,对于
8列
a
,列索引应该相当于使用
[2,3,4,5,6,7]
进行索引

让我们试试看-

In [370]: a[a[:,0]==3,[2,3,4,5,6,7]]
....
IndexError: shape mismatch: indexing arrays could ...
     not be broadcast together with shapes (2,) (6,) 
我们正在那里触发
broadcastable
索引。用于索引到两个轴的元素具有不同的长度,并且不可广播

让我们来验证一下。用于索引到
行的数组
-

In [374]: a[:,0]==3
Out[374]: array([False, False, False, False, False,  True,  True, False, False, False], dtype=bool)
本质上,这是两个元素的数组,因为有两个
True
元素-

In [375]: np.where(a[:,0]==3)[0]
Out[375]: array([5, 6])
用于索引列的数组为
[2,3,4,5,6,7]
,其长度为
6
,因此不能针对行索引进行广播

为了达到选择行ID的预期目标:
5,6
,并为每一行选择列ID
2,3,4,5,6,7
,我们可以创建可广播的
开放网格,如下所示-

In [376]: np.ix_(a[:,0]==3, [2,3,4,5,6,7])
Out[376]: 
(array([[5],
        [6]]), array([[2, 3, 4, 5, 6, 7]]))
最后,用所需的o/p索引到输入数组中-

In [377]: a[np.ix_(a[:,0]==3, [2,3,4,5,6,7])]
Out[377]: 
array([[2, 4, 2, 0, 3, 4],
       [1, 0, 0, 1, 2, 0]])

注意-这是基本索引和高级索引的混合,它可以提供@user2357112感谢您指出这一点!编辑了一些关于如何在这里应用的细节。呸,这很有道理。非常感谢您详尽的回答!
In [377]: a[np.ix_(a[:,0]==3, [2,3,4,5,6,7])]
Out[377]: 
array([[2, 4, 2, 0, 3, 4],
       [1, 0, 0, 1, 2, 0]])