我有一个非常简单的任务,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内执行此操作,如果有任何不同的话。有人可以解释这里发生的事情以及如何避免吗?抱歉,如果这是重复的话。
答案 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
的值时,它被强制为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. ])
答案 2 :(得分:0)
问题是dtype
。它是int64
,您需要将其更改为float64
(或仅更改为float
):
some_array = some_array.astype('float')