用0到1之间的值替换numpy数组元素

时间:2019-04-11 14:24:11

标签: python arrays numpy

我有一个非常简单的任务,numpy正在做我不了解的事情。我试图用0到1之间的数字替换满足某些条件的数组元素,并且numpy将它们全部转换为零。例如:

In [1]: some_array = np.array([0,0,0,1,0,1,1,1,0])

In [2]: nonzero_idxs = np.where(some_array != 0)[0]

In [3]: nonzero_idxs
Out[3]: array([3, 5, 6, 7])

In [4]: some_array[nonzero_idxs] = 99

In [5]: some_array
Out[5]: array([ 0,  0,  0, 99,  0, 99, 99, 99,  0])

In [6]: some_array[nonzero_idxs] = 0.2

In [7]: some_array[nonzero_idxs]
Out[7]: array([0, 0, 0, 0])

In [8]: some_array[nonzero_idxs] == 0
Out[8]: array([ True,  True,  True,  True], dtype=bool)

如上面的示例所示,将值替换为任意值可以按预期方式工作,但是,如果您尝试将其替换为小数,则会将其变为零(而且它们不只是 look 在打印数组时就像零,它们的求值等于零。当我尝试通过其他方式(例如,使用np.place)进行此操作时,也会发生相同的行为。

我正在终端上的iPython内执行此操作,如果有任何不同的话。有人可以解释这里发生的事情以及如何避免吗?抱歉,如果这是重复的话。

3 个答案:

答案 0 :(得分:4)

some_array = np.array([0,0,0,1,0,1,1,1,0]).astype(float) 

使用numpy数组作为浮点数将解决您的问题。默认情况下,它似乎是整数,只是将其值减小到零。

nonzero_idxs = np.where(some_array != 0)[0]
some_array[nonzero_idxs] = 0.2
# output: array([0. , 0. , 0. , 0.2, 0. , 0.2, 0.2, 0.2, 0. ])

答案 1 :(得分:2)

原因很简单。

与Python lists不同,numpy数组只能包含特定类型及其子类型的元素。

定义some_array时,它被创建为int32数组。因此,当您尝试为其分配类型为float的值时,它被强制为intint(0.2) == 0

与您指定数组应包含float32的情况进行比较:

some_array = np.array([0, 0, 0, 1, 0, 1, 1, 1, 0], dtype=np.float)
nonzero_idxs = np.where(some_array != 0)[0]
some_array[nonzero_idxs] = 0.2
some_array

输出:

array([0. , 0. , 0. , 0.2, 0. , 0.2, 0.2, 0.2, 0. ])

答案 2 :(得分:0)

问题是dtype。它是int64,您需要将其更改为float64(或仅更改为float):

some_array = some_array.astype('float')