用0到1之间的值替换numpy数组元素[重复]

问题描述 投票:2回答:3

这个问题在这里已有答案:

我有一个非常简单的任务,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)

如上例所示,用一些任意值替换值按预期工作,但如果你尝试用小数替换它,它会把它变成零(当你打印数组时它们看起来不像零,它们'评估等于零)。当我尝试以其他方式解决此问题时会发生相同的行为,例如,使用np.place。

我在终端上的iPython中这样做,如果这有任何区别。有人可以解释这里发生了什么,以及如何避免它?如果这是重复的道歉。

python arrays numpy
3个回答
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. ])

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. ])

0
投票

问题是dtype。它是int64,你需要将它改为float64(或只是float):

some_array = some_array.astype('float')

© www.soinside.com 2019 - 2024. All rights reserved.