【问题标题】:Create a Numpy scalar from dtype从 dtype 创建一个 Numpy 标量
【发布时间】:2021-03-03 04:15:41
【问题描述】:

我正在尝试创建一个指定 dtype 的 numpy 标量。我知道我可以做到,比如x = numpy.int16(3),但我事先不知道 dtype。

如果我想要一个数组,那么

dtype = int
x = numpy.array(3, dtype=dtype)

会做,所以我对

寄予厚望
x = numpy.generic(3, dtype=dtype)

但是不能创建numpy.generic 的实例。

有什么想法吗?

【问题讨论】:

  • 我不确定是什么问题。为什么x = dtype(3) 不做你想做的事?
  • @DSM:严格来说,这并不适用。在 OP 的示例中,将创建 int(3) 而不是 numpy.int32(3)。这是否是一个问题,我不知道。
  • @NPE:我假设通过“指定的 dtype”,OP 已将所需的 dtype 放入 dtypeint 将提供intnp.int16 将提供np.int16。不过,我一定遗漏了一些东西,因为 OP 知道您可以调用类型对象(在第一行中),并且您可以将类型对象绑定到 dtype
  • @DSM,抱歉混淆,我有类似a = np.eye(2, dtype=int)b = np.zeros(2, dtype=a.dtype) 的代码,所以a.dtype 可以作为dtype 参数传递,但a.dtype(3) 给出不可调用的错误。 .type 方法可以满足我的需要(“使 dtypes 可调用”)。

标签: python numpy


【解决方案1】:

以下将创建x dtype 的标量:

In [18]: val = x.dtype.type(3)

In [19]: val
Out[19]: 3

In [20]: type(val)
Out[20]: numpy.int32

【讨论】:

  • 谢谢 - 我不知道 dtypes 的 .type 方法
  • 然而,这并不适用于所有 dtype,也不会为任何 dtype 保留字节序(总是将其转换为原生字节序)。我相信保持字节序和使用更多 dtypes(但可能仍然不是全部)的唯一方法是创建一个数组并从中获取元素。
【解决方案2】:

作为commented,接受的答案通常并非对所有 dtypes 都是正确的,例如 timedeltas:

In [6]: d = np.dtype("timedelta64[10m]")

In [7]: d.type(3)
Out[7]: numpy.timedelta64(3)

要始终获得正确答案,请使用以下方法:

In [8]: np.array(3, d)[()]
Out[8]: numpy.timedelta64(3,'10m')

【讨论】:

    【解决方案3】:

    如果有人想从字符串中获取 dtype,您可以使用

    import numpy as np
    val = np.dtype('int32').type(3.0)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 2012-10-23
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      相关资源
      最近更新 更多