块状多维切片

时间:2019-04-03 11:43:44

标签: python numpy numpy-broadcasting

如果a具有二维Numpy数组:

array([[0, 1, 0, 0, 0, 1, 0, 0, 0, 1],
       [0, 0, 0, 0, 1, 0, 1, 1, 1, 0],
       [1, 0, 1, 1, 1, 1, 1, 1, 1, 1],
       [0, 0, 1, 1, 1, 0, 1, 0, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 1, 1]])

我想将每一行切成等于1的第一个索引位置,如下所示:

array([[0, 1],
       [0, 0, 0, 0, 1],
       [1],
       [0, 0, 1,
       [0, 0, 1])

是否可以使用广播来实现此目的,或者所有输出阵列都必须具有相同的形状?我有使用以下解决方案的方法,但我很好奇是否可以使用广播来实现?

x = np.random.choice([0,1], size = [5,10])
idx = x.argmax(axis = 1) 

np.array([row[:i] for row, i in zip(x, idx + 1)])

1 个答案:

答案 0 :(得分:0)

您可以使用dtype=object

a =np.array([[0, 1, 0, 0, 0, 1, 0, 0, 0, 1],
       [0, 0, 0, 0, 1, 0, 1, 1, 1, 0],
       [1, 0, 1, 1, 1, 1, 1, 1, 1, 1],
       [0, 0, 1, 1, 1, 0, 1, 0, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 1, 1]]) 
idx = a.argmax(axis = 1) 
a = np.array([row[:i] for row, i in zip(a, idx + 1)], dtype=object)

输出为:

a = array([array([0, 1]), array([0, 0, 0, 0, 1]), array([1]),
       array([0, 0, 1]), array([0, 0, 1])], dtype=object)