用0到1之间的值替换numpy数组元素[重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用0到1之间的值替换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)
如上例所示,用一些任意值替换值按预期工作,但如果你尝试用小数替换它,它会把它变成零(当你打印数组时它们看起来不像零,它们'评估等于零)。当我尝试以其他方式解决此问题时会发生相同的行为,例如,使用np.place。
我在终端上的iPython中这样做,如果这有任何区别。有人可以解释这里发生了什么,以及如何避免它?如果这是重复的道歉。
答案
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. ])
另一答案
原因很简单。
与Python lists
不同,numpy
数组只能包含某种类型的元素及其子类型。
当您定义some_array
时,它被创建为int32
数组。因此,当您尝试为其指定float
类型的值时,它会被强制转换为int
和int(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. ])
另一答案
问题是dtype
。它是int64
,你需要将它改为float64
(或只是float
):
some_array = some_array.astype('float')
以上是关于用0到1之间的值替换numpy数组元素[重复]的主要内容,如果未能解决你的问题,请参考以下文章