Python 将numpy数组元素替换为介于0和1之间的值

Python 将numpy数组元素替换为介于0和1之间的值,python,arrays,numpy,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_arr

我有一个非常简单的任务,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
列表不同,
numpy
数组只能包含特定类型及其子类型的元素

定义
some_数组时,它被创建为
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\u array=some\u array.astype('float')

旁注,它在Windows上不会是
int64
,而是
int32
。这可能会导致像
sum()
这样的内容出现意外和无声的溢出,因此值得记住。只需在Windows上使用Jupyter进行尝试,默认情况下它是
int64
。也许这取决于建筑。朱彼特当时正在介入。在Python中,它不应该是
int64
。什么版本的Windows?也许他们在Windows 10中更改了默认的int类型好的是的,我刚才试过同样的测试。。。结果是5。所以为什么它强迫它们是整数?这对我来说似乎很奇怪。谢谢@pault。答案隐藏在对这个问题的回答中。如果数组只包含整数,它将拒绝使用浮点替换元素。您必须执行类似于some_array=some_array.astype(float)的操作。我自己永远不会想到这一点。也许这个问题应该作为这个问题的重复来解决。