我在numpy数组中有一些数据,例如:
a = np.array([1,2,3,4,5,6,7,8,9,10])
然后我想要从这个数组中对一些值进行子集化,即:
b = a[a > 5]
这样:
b = np.array([6,7,8,9,10])
然后,我对这个子集进行了一些简单的计算,即:
c = b + 1
这样:
c = np.array([7,8,9,10,11])
然后我想用更新的值重新填充原始数组,以便最终得到:
d = np.array([1,2,3,4,5,7,8,9,10,11])
我的真实数据显然比这更多参与,所以我想避免仅通过索引原始数组中感兴趣的值来在一行中完成它(除非当然这是最简单的方法)。
我们非常感谢您提供的任何帮助,以便将数组c
中的值填充回数组a
以获取数组d
。
答案 0 :(得分:3)
你可以写:
>>> a[a > 5] += 1
>>> a
array([ 1, 2, 3, 4, 5, 7, 8, 9, 10, 11])
+=
修改数组。
要保存a > 5
所在的索引数组,您可以根据EdChum的建议使用np.where
(或等效np.nonzero
):
>>> np.where(a > 5)
(array([5, 6, 7, 8, 9]),)
(这将返回索引数组的元组 - 每个维度为a
一个。)
答案 1 :(得分:1)
您可以使用np.where
:
In [55]:
np.where(a > 5, a + 1, a)
Out[55]:
array([ 1, 2, 3, 4, 5, 7, 8, 9, 10, 11])
第一个参数是布尔条件,第二个参数是条件为真的返回值,第三个参数是返回值,如果为假。
如果你想生成一个新的数组,那么你可以使用你要修改的数组的副本而不是存储布尔掩码:
In [56]:
a = np.array([1,2,3,4,5,6,7,8,9,10])
b = a > 5
b
Out[56]:
array([False, False, False, False, False, True, True, True, True, True], dtype=bool)
In [57]:
d = np.where(b, a + 1, a)
d
Out[57]:
array([ 1, 2, 3, 4, 5, 7, 8, 9, 10, 11])
原始数组未受影响
In [58]:
a
Out[58]:
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
如果您想要索引值,可以使用np.nonzero
:
In [84]:
np.nonzero(b)
Out[84]:
(array([5, 6, 7, 8, 9], dtype=int64),)