我尝试插入一个numpy矩阵,给定一个掩码,每行定义一个单元格。实际上,它会在每行中插入一个值,但使用不同的列。我试图使用np.insert()
但没有成功:
>>> x
array([[False, False, True, False, False],
[False, False, True, False, False],
[False, False, True, False, False],
[False, False, True, False, False],
[False, False, True, False, False]], dtype=bool)
>>> y = np.arange(25).reshape(5,5)
>>> y
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
>>> np.insert(y, np.where(x)[1], 99, axis=1)
array([[ 0, 1, 99, 99, 99, 99, 99, 2, 3, 4],
[ 5, 6, 99, 99, 99, 99, 99, 7, 8, 9],
[10, 11, 99, 99, 99, 99, 99, 12, 13, 14],
[15, 16, 99, 99, 99, 99, 99, 17, 18, 19],
[20, 21, 99, 99, 99, 99, 99, 22, 23, 24]])
任何时候我尝试基于x
掩码插入,它最终会复制值。
同样如上所述,掩模可能以不是简单列的方式设置。例如:
>>> x = np.zeros((5, 5), dtype=bool)
>>> x[1:, 2] = True
>>> x[0, 1] = True
>>> x
array([[False, True, False, False, False],
[False, False, True, False, False],
[False, False, True, False, False],
[False, False, True, False, False],
[False, False, True, False, False]], dtype=bool)
这意味着我无法简单地将特定列指定为插入的索引:
>>> np.insert(y, 2, [99, 99, 99, 99, 99], axis=1)
array([[ 0, 1, 99, 2, 3, 4],
[ 5, 6, 99, 7, 8, 9],
[10, 11, 99, 12, 13, 14],
[15, 16, 99, 17, 18, 19],
[20, 21, 99, 22, 23, 24]])
所需的输出是:
array([[ 0, 99, 1, 2, 3, 4],
[ 5, 6, 99, 7, 8, 9],
[10, 11, 99, 12, 13, 14],
[15, 16, 99, 17, 18, 19],
[20, 21, 99, 22, 23, 24]])
非常感谢任何帮助!
答案 0 :(得分:1)
方法#1:这是boolean-indexing
的一种方式 -
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
示例运行 -
In [88]: y
Out[88]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
In [89]: x
Out[89]:
array([[False, True, False, False, False],
[False, False, True, False, False],
[False, False, False, False, True],
[ True, False, False, False, False],
[False, False, True, False, False]], dtype=bool)
In [90]: insert_one_per_row(y, x, putval=99)
Out[90]:
array([[ 0, 99, 1, 2, 3, 4],
[ 5, 6, 99, 7, 8, 9],
[10, 11, 12, 13, 99, 14],
[99, 15, 16, 17, 18, 19],
[20, 21, 99, 22, 23, 24]])
我们还可以为每行分配不同的值 -
In [91]: insert_one_per_row(y, x, putval=[-1,-2,-3,-4,-5])
Out[91]:
array([[ 0, -1, 1, 2, 3, 4],
[ 5, 6, -2, 7, 8, 9],
[10, 11, 12, 13, -3, 14],
[-4, 15, 16, 17, 18, 19],
[20, 21, -5, 22, 23, 24]])
方法#2:我们将在掩码上获得展平的True
位置,并在这些位置的输入数组的展平版本上插入带有np.insert
的新值,就像这样 -
def insert_one_per_row_v2(arr, mask, putval):
idx = np.flatnonzero(mask)
return np.insert(arr.ravel(), idx, putval).reshape(arr.shape[0],-1)
答案 1 :(得分:0)
实际上,您可以使用np.where
np.where(x, np.full_like(y, 99), y)
这是输出:
In [9]: x
Out[9]:
array([[False, True, False, False, False],
[False, False, True, False, False],
[False, False, True, False, False],
[False, False, True, False, False],
[False, False, True, False, False]], dtype=bool)
In [10]: y
Out[10]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
In [11]: np.where(x, np.full_like(y, 99), y)
Out[11]:
array([[ 0, 99, 2, 3, 4],
[ 5, 6, 99, 8, 9],
[10, 11, 99, 13, 14],
[15, 16, 99, 18, 19],
[20, 21, 99, 23, 24]])
由于