我有一个130 X 13的numpy矩阵。假设我要选择一组满足条件的特定行和一列列-
trainx[trainy==label,[0,6]]
以上代码无效,并引发错误-IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (43,) (2,).
但是,如果我分两步进行-首先是行的子集,然后是列,则可以。这样很奇怪还是很麻木?
temp1 = trainx[trainy==label,:]
temp1 = temp1[:,[0,6]]
您可以像这样简单地链接索引
trainx[trainy==label][:, [0,6]]
可运行示例
arr = np.random.rand(130,13)
arr[arr[:,0]>0.5][:, [0,6]]
In [154]: x = np.arange(24).reshape(6,4)
In [155]: mask = np.array([1,0,1,0,1,0],bool)
使用您的两步方法:
In [156]: x[mask] # x[mask, :]
Out[156]:
array([[ 0, 1, 2, 3],
[ 8, 9, 10, 11],
[16, 17, 18, 19]])
In [157]: x[mask][:,[1,3]]
Out[157]:
array([[ 1, 3],
[ 9, 11],
[17, 19]])
或者这两个索引可以与ix_
组合:
In [158]: np.ix_(mask, [1,3])
Out[158]:
(array([[0],
[2],
[4]]), array([[1, 3]]))
In [159]: x[np.ix_(mask, [1,3])]
Out[159]:
array([[ 1, 3],
[ 9, 11],
[17, 19]])
请注意,Out[158]
中的第一个数组是np.nonzero(mask)[0][:,None]
,这是列矢量形式的非零索引。