2013-12-23 36 views
1

好it's晚了,我不能再解决最简单的问题:替换“零柱”与值从numpy的阵列

我有“零列”的矩阵,这些列应改为

从另一阵列(同一列的索引),具有相同的列数的值:

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 

我想也许复杂的,但也许有人找到一个快速的解决方案......

+1

为什么你用'0.3'和'0.8'填充?如果它们对齐,它会不会是“0.4”和“0.8”? – DSM

+0

你是对的,我编辑了问题 – Hiatus

回答

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]]) 
+0

谢谢,为什么你乘以'* 1.0' – Hiatus

+0

因为如果你不这样做,'a'会有'dtype = int'。如果你试图将一个float放入一个int数组中,你将不会得到你想要的。 – DSM

+0

但是,检查浮点数上的相等性是否正确? –

0

短一点,并与高维数组作为工作只要它们是可以播放的

np.where((a == 0.).all(axis=0), b, a) 

不幸的是,因为numpy 1.8它的速度比直接慢像DSM提出的索引,更普遍的变体将是:

wild = (a == 0).all(axis=0) 
c = a.copy() 
c[(slice(None),) + np.nonzero(wild)] = b[wild]