我有一个二维数组,试图在列和行中将其切成一定范围。到目前为止,我一直在使用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}}。
答案 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
的了解越清楚。添加数组的相同规则在这里适用。