如果事先不知道维度和选择标准的数量,那么将列表传递给numpy.ix_,或者如何切割多维数组?

时间:2016-05-10 14:45:12

标签: python numpy multidimensional-array slice

我想在Numpy中切片一个多维数组。 假设我的数组是一个5 * 5 * 5数组,理论上的切片可以使用numpy.ix _来完成:

    s0 = [0,1,2]
    s1 = [1,2,3]
    s2 = [1,2,3]
    b = a[numpy.ix_(s0,s1,s2)]

问题是数组的维度以及我需要在不同维度上切割数组的方式在程序中发生变化(例如数组' a'可能是2,3,4 ,...维度,s0,s1,......也改变了),所以上面的代码并不像我喜欢的那样工作,除非我可以将列表/元组传递给numpy.ix_,如下所示:

    N = 3
    M = 3
    s = [np.ones(M).astype(int) for i in range(N)]
    s[0] = [0,1,2]
    s[1] = [1,2,3]
    s[2] = [1,2,3]        
    b = a[numpy.ix_(s)]

遗憾的是,它不起作用,因为ix_只接受一维对象(?)。什么是最好的解决方法?如何自己干净地实施ix_(或者有更简单的方法吗?)?

1 个答案:

答案 0 :(得分:2)

使用* argument-unpacking operator

b = a[numpy.ix_(*s)]

相当于

b = a[numpy.ix_(s[0], s[1], ..., s[n])]

例如,

import numpy as np

N = 3
M = 3
a = np.arange((M+1)**N).reshape([M+1]*N)
s = [np.ones(M).astype(int) for i in range(N)]
s[0] = [0,1,2]
s[1] = [1,2,3]
s[2] = [1,2,3]        
b = a[np.ix_(*s)]
print(b)

打印

[[[ 5  6  7]
  [ 9 10 11]
  [13 14 15]]

 [[21 22 23]
  [25 26 27]
  [29 30 31]]

 [[37 38 39]
  [41 42 43]
  [45 46 47]]]