我在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
插入新列?
答案 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]])