我们说我有一个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的某个地方!对于那些想知道我为什么要这样做的人来说,这是因为我想将几个切片合并在一起,在索引上不使用(〜)等。
答案 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
所做的。