如何索引二维数组的二维部分?

时间:2020-02-12 18:33:25

标签: python arrays numpy indexing

我有一个二维数组,试图在列和行中将其切成一定范围。到目前为止,我一直在使用numpy.where()来索引我的数组,其中一个索引是一个数组,一个索引是标量;即,我一直在索引单个行或列的一部分。现在,我想将所有条目存储在一定范围的列和一定范围的行中,但是当我这样做时,numpy似乎并不喜欢它。

我已经尝试过:

findex = np.where((freqs>63)&(freqs<92))
findex = np.array(findex[0])
tindex = np.where((t>0.5)&(t<1.5))
tindex = np.array(tindex[0])

print(Xsum[findex,tindex])

其中Xsum(一个频谱图)是我的数组和频率,t是其形状与Xsum的列和行数匹配的数组(形状(x,1))。我需要能够通过freqs和t中的值在Xsum中找到条目,这就是为什么我一直使用numpy.where()的原因。

这是我收到的错误消息:

IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (28,) (15,) 

我一直在寻找其他方法来做到这一点,但没有骰子。有没有办法为我的数组建立索引,以便获得它的块,而不是列或行?

编辑: 例如,假设我的数组是:

np.array([1,2,3,4],
         [5,6,7,8],
         [9,10,11,12])

我想要某种方法对其进行索引以获得此数组:

([6,7,8],
 [10,11,12])

即第2-3行和第2-4列中的条目,请记住,我不知道要查找的确切索引,仅是其他数组中的值,这就是为什么我不得不使用{ {1}}。

1 个答案:

答案 0 :(得分:0)

使用分片进行基本索引是最简单的方法:

In [382]: arr = np.arange(1,13).reshape(3,4)                                                   
In [383]: arr[1:, 1:]                                                                          
Out[383]: 
array([[ 6,  7,  8],
       [10, 11, 12]])

对于列表或数组,他们必须broadcast彼此对抗:

In [385]: arr[[[1],[2]], [1,2,3] ]                                                             
Out[385]: 
array([[ 6,  7,  8],
       [10, 11, 12]])

或等效于数组:

In [386]: np.ix_([1,2],[1,2,3])                                                                
Out[386]: 
(array([[1],
        [2]]), array([[1, 2, 3]]))
In [387]: arr[_]                                                                               
Out[387]: 
array([[ 6,  7,  8],
       [10, 11, 12]])

这是(2,1)数组与(3,)(或(1,3))组合以选择(2,3)块。

如果两个数组/列表的长度不匹配,则会出现错误:

In [388]: arr[[1,2], [1,2,3] ]                                                                 
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-388-f14b94e53ccb> in <module>
----> 1 arr[[1,2], [1,2,3] ]

IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (3,) 

如果它们的长度确实匹配,则会得到一个“对角线”而不是一个块:

In [389]: arr[[1,2], [1,2] ]                                                                   
Out[389]: array([ 6, 11])

您对broadcasting的了解越清楚。添加数组的相同规则在这里适用。