Numpy切片到指数

时间:2017-09-14 19:12:27

标签: python numpy

我们说我有一个3x3矩阵。该矩阵的一维指数是:

0 1 2
3 4 5
6 7 8

是否有一个函数接收切片并返回1D索引,是否为维度?类似的东西:

m = np.ones((3, 3))
id1 = some_function(m, (1, :))  # [3, 4, 5]
id2 = some_function(m, (:, 1))  # [1, 4, 7]

# Use the indices together
m[id1 + id2] = wathever
m[~(id1 + id2)] = wathever else

我不想编码,因为我确定它存在于numpy的某个地方!对于那些想知道我为什么要这样做的人来说,这是因为我想将几个切片合并在一起,在索引上不使用(〜)等。

1 个答案:

答案 0 :(得分:1)

ravel_multi_index返回1d等价的n-d索引元组:

In [208]: np.ravel_multi_index(([1],[0,1,2]),(3,3))
Out[208]: array([3, 4, 5], dtype=int32)
In [209]: np.ravel_multi_index(([0,1,2],[1]),(3,3))
Out[209]: array([1, 4, 7], dtype=int32)

对于更复杂的索引,我们可能需要使用ix_来正确地进行索引广播:

In [214]: np.ravel_multi_index((np.ix_([0,1,2],[1,2])),(3,3))
Out[214]: 
array([[1, 2],
       [4, 5],
       [7, 8]], dtype=int32)

现在我们只需将[1,:]转入该元组即可。 indexing_tricks中的某些内容应该这样做。

In [222]: np.ravel_multi_index((np.ix_(np.r_[0:3],[1,2])),(3,3))
Out[222]: 
array([[1, 2],
       [4, 5],
       [7, 8]], dtype=int32)
In [223]: np.ravel_multi_index((np.ix_([1],np.r_[0:3])),(3,3))
Out[223]: array([[3, 4, 5]], dtype=int32)

在更一般的情况下,我们希望使用m.shape代替(3,3)

~适用于布尔掩码,而不是索引。所以要删除'数组中的[1]元素,我们可以这样做:

In [225]: mask = np.ones((3,),bool)
In [226]: mask[1] = False       # index to delete
In [227]: np.arange(3)[mask]
Out[227]: array([0, 2])

这基本上是np.delete所做的。