将新列插入numpy数组

时间:2018-04-10 14:04:25

标签: python arrays numpy

我在python中有一个名为numpy且大小为5x5的my_values数组和一个numpy向量,其中包含大小为1x90(5 False,85 True)naned cols_index的布尔值。我想在cols_indexes等于my_values的位置索引中用零填充我的初始数组False。因此,最后我的变换矩阵my_values的大小应为5x90(其中85个新列填充零)。使用数组而不是布尔值向量的简单示例是:

def insert_one_per_row(arr, mask, putval):

   mask_ext = np.column_stack((mask, np.zeros((len(mask), 1), dtype=bool)))
   out = np.empty(mask_ext.shape, dtype=arr.dtype)
   out[~mask_ext] = arr.ravel()
   out[mask_ext] = putval
   return out

y = np.arange(25).reshape(5, 5)
x = np.array([[False,  True,  False, False, False],
          [False,  True,  False, False, False],
          [False,  True,  False, False, False],
          [False,  True,  False, False, False],
          [False,  True,  False, False, False]], dtype=bool)

arr = insert_one_per_row(y, x, putval=0)

此示例适用于布尔值数组。但是在我的情况下,x是向量而不是数组。 x包含True,表示我需要添加的位置中的新列,以及False表示最终数组位置中的现有列。如何使用向量x而不是矩阵x插入新列?

1 个答案:

答案 0 :(得分:1)

您的输入 - 已调整为工作:

In [73]: y = np.arange(1,21).reshape(5, 4)
    ...: x = np.array([[False,  True,  False, False, False],
    ...:           [False,  True,  False, False, False],
    ...:           [False,  True,  False, False, False],
    ...:           [False,  True,  False, False, False],
    ...:           [False,  True,  False, False, False]], dtype=bool)
    ...:           

整个数组掩码,大致是你的函数所做的

In [74]: res = np.full(x.shape, 0)    # assign the putval on creation
In [75]: res[~x] = y.ravel()
In [76]: res
Out[76]: 
array([[ 1,  0,  2,  3,  4],
       [ 5,  0,  6,  7,  8],
       [ 9,  0, 10, 11, 12],
       [13,  0, 14, 15, 16],
       [17,  0, 18, 19, 20]])

我们可以使用where从1d掩码中获取列索引,这里有一行x

In [77]: res[:, np.where(~x[0,:])[0]]
Out[77]: 
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16],
       [17, 18, 19, 20]])

赋值 - 但不要使用ravel,因为RHS是(4,5)。这个索引不会像完整的布尔掩码一样展平数组:

In [80]: res[:, np.where(~x[0,:])[0]] = 2*y
In [81]: res
Out[81]: 
array([[ 2,  0,  4,  6,  8],
       [10,  0, 12, 14, 16],
       [18,  0, 20, 22, 24],
       [26,  0, 28, 30, 32],
       [34,  0, 36, 38, 40]])