将“零列”替换为numpy数组中的值

时间:2013-12-23 02:34:41

标签: python arrays numpy scipy

好吧已经很晚了,我无法解决最简单的问题了:

我有一个带有“零列”的矩阵,这些列应该替换为

具有相同列数的另一个数组(相同列索引)中的值:

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
我可能会想复杂,但也许有人找到了快速的解决方案......

2 个答案:

答案 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]