使用np.where的numpy掩码然后替换值

时间:2018-08-06 07:06:08

标签: python arrays numpy

我有两个形状相同的二维numpy数组,比方说(10,6)。

第一个数组<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="points__fees"> <div class="points__fees__label">Fees / Charges</div> <div class="points__fees__value"> <div class="points__fees__value__item" data-type="star$"> <span class="points__fees__text">0</span> Star $ <input class="points__fees__input" value="0" type="hidden"> </div> <div class="points__fees__value__item" data-type="diamond$"> <span class="points__fees__text">0</span> Diamond $ <input class="points__fees__input" value="0" type="hidden"> </div> <div class="points__fees__value__item" data-type="gold$"> <span class="points__fees__text">0</span> Gold $ <input class="points__fees__input" value="0" type="hidden"> </div> </div> </div>充满了一些有意义的浮点数。

x

第二个数组x = np.arange(60).reshape(-1,6) 是稀疏数组,每行仅包含2个非零值。

a

然后有一个形状为(10,2)的第三个数组,我想在a = np.zeros((10,6)) for i in range(10): a[i, 1] = 1 a[i, 2] = 1 不为零的位置将每行的值更新为第一个数组x

a

因此原始的v = np.arange(20).reshape(10,2) 和更新的x将是:

x

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, 25, 26, 27, 28, 29],
   [30, 31, 32, 33, 34, 35],
   [36, 37, 38, 39, 40, 41],
   [42, 43, 44, 45, 46, 47],
   [48, 49, 50, 51, 52, 53],
   [54, 55, 56, 57, 58, 59]])

我尝试了以下方法

array([[ 0,  0,  1,  3,  4,  5],
   [ 6,  2,  3,  9, 10, 11],
   [12,  4,  5, 15, 16, 17],
   [18,  6,  7, 21, 22, 23],
   [24,  8,  9, 27, 28, 29],
   [30, 10, 11, 33, 34, 35],
   [36, 12, 13, 39, 40, 41],
   [42, 14, 15, 45, 46, 47],
   [48, 16, 17, 51, 52, 53],
   [54, 18, 19, 57, 58, 59]])

然后我得到了一个错误x[np.where(a!=0)] = v

这种方法有什么问题,有替代方法吗?非常感谢。

2 个答案:

答案 0 :(得分:1)

由于@Divakar的评论,出现此问题是因为赋值标记=两侧的两个变量的形状不同。

在左侧,表达式x[np.where(a!=0)]x[a!=0]x[np.nonzero(a)]的结构不正确,其形状为(20,)

在右边,我们需要一个形状相似的数组来完成分配。因此,简单的ravel()reshape(-1)就可以完成这项工作。

因此解决方案就像x[a!=0] = v.ravel()一样简单。

答案 1 :(得分:0)

import numpy as np

arrayOne = np.random.rand(6).reshape((2, 3))
arrayTwo = np.asarray([[0,1,2], [1,2,0]])
arrayThree = np.zeros((2, 2))

arrayOne[arrayTwo != 0] = arrayThree.ravel()
print(arrayOne)

[[0.56251284 0.         0.        ]
 [0.         0.         0.20076913]]

有关编辑的注意事项:上面的解决方案不是我的,所有功劳归Divakar所有。我之所以进行编辑,是因为我先前的答案误解了OP的问题,并且希望避免造成混淆。