使用numpy块(切片)表示法动态获取子矩阵

时间:2019-02-28 13:32:47

标签: python numpy

我想要一个n维矩阵的子矩阵。事先不知道矩阵的维数。因此给出:

import random

a = [10 for _ in range(0, random.randint(0,10))]
M = np.full(a, True)
# Now get the submatrix dynamically with block notation
# so something like:
# str = ["1:5" for _ in range(0, len(a))].join(",")
# N = eval("M[ " + str + "]")

我想知道一种明智的方法,也可以在速度上明智地实现这种符号。

Numpy extract submatrix中提供的另一个答案不能直接解决问题,因为使用.ix_接受的答案不接受切片。)

2 个答案:

答案 0 :(得分:2)

我们可以使用np.s_,其背后使用slice表示法-

M[[np.s_[1:5]]*M.ndim]

这给了我们FutureWarning

  

FutureWarning:对多维使用非元组序列   索引已弃用

为避免这种情况,我们需要用tuple()包装,就像这样-

M[tuple([np.s_[1:5]]*M.ndim)]

使用显式slice表示法是-

M[tuple([slice(1,5)]*M.ndim)]

答案 1 :(得分:1)

有了不错的与堆栈溢出相关的搜索选项,我已经看到np.ix_Numpy extract submatrix,那么它将变成:

N = M[np.ix_(*[range(1,5) for _ in range(0, len(a))])]