好吧已经很晚了,我无法解决最简单的问题了:
我有一个带有“零列”的矩阵,这些列应该替换为
具有相同列数的另一个数组(相同列索引)中的值:
a=np.array([[2,0,0,0],[1,0,2,0],[1,0,5,0]])
b=np.array([0.3,0.4,0.6,0.8])
结果应为:
c=np.array([[2,0.4,0,0.8],[1,0.4,2,0.8],[1,0.4,5,0.8]])
我试过了:
#searches for an entire zero-column indexes
wildcard_cols = np.nonzero(a.sum(axis=0) == 0)
我得到:
out: wildcard_cols=array([[1, 3]], dtype=int64)# that is right
然后我想从这个输出中获取一个列表来迭代列表中的项目
wildcard_cols=np.asarray(wildcard_cols)
wildcard_cols=wildcard_cols.tolist()
但是我在列表中得到一个列表(?) out = [[1,3]]
所以我不能这样做:
for item in wildcard_cols:
a[:,item]=b[item]
#this does not work because i want to change every value in the column
我可能会想复杂,但也许有人找到了快速的解决方案......
答案 0 :(得分:2)
IIUC,怎么样:
>>> a = np.array([[2,0,0,0],[1,0,2,0],[1,0,5,0]])*1.0
>>> b = np.array([0.3,0.4,0.6,0.8])
>>> wild = (a == 0).all(axis=0)
>>> c = a.copy()
>>> c[:,wild] = b[wild]
>>> c
array([[ 2. , 0.4, 0. , 0.8],
[ 1. , 0.4, 2. , 0.8],
[ 1. , 0.4, 5. , 0.8]])
答案 1 :(得分:0)
稍短一点,只要它们是可广播的
,就可以使用更高维度的数组np.where((a == 0.).all(axis=0), b, a)
不幸的是,从numy 1.8开始,它比DSM提出的直接索引更慢,更常见的变体是:
wild = (a == 0).all(axis=0)
c = a.copy()
c[(slice(None),) + np.nonzero(wild)] = b[wild]