【问题标题】:replace numpy array elements with a value between 0 and 1 [duplicate]用 0 到 1 之间的值替换 numpy 数组元素 [重复]
【发布时间】:2019-04-11 14:24:10
【问题描述】:

我有一个非常简单的任务,而 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 中执行此操作,如果这有什么不同的话。有人可以解释这里发生了什么,以及如何避免它吗?如有重复请见谅。

【问题讨论】:

  • 好的,是的,我刚刚尝试过同样的测试……结果是 5。那么……为什么要强制它们成为整数?这对我来说似乎很奇怪。
  • 谢谢@pault。答案隐藏在对该问题的回答中。如果数组只包含整数,它拒绝让您用浮点数替换元素。你必须做一些类似 some_array = some_array.astype(float) 的事情。我自己永远不会想到这一点。
  • 也许这个问题应该作为这个问题的副本关闭。

标签: python arrays numpy


【解决方案1】:

原因很简单。

与 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】:
    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. ])
    

    【讨论】:

      【解决方案3】:

      问题是dtype。是int64,你需要把它改成float64(或者只是float):

      some_array = some_array.astype('float')

      【讨论】:

      • 旁注,在 Windows 上它不会是 int64 - 它将是 int32。这可能会导致 sum() 等内容出现意外和静默溢出,因此值得牢记。
      • 刚刚在 Windows 上使用 Jupyter 进行了尝试,默认为 int64。也许这取决于架构。
      • Jupyter 正在介入。它不应该是 Python 中的 int64。什么版本的 Windows?也许他们更改了 Windows 10 中的默认 int 类型
      猜你喜欢
      • 1970-01-01
      • 2018-03-30
      • 2019-03-30
      • 2022-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多