【问题标题】:Array operations on heterogeneous numpy arrays异构 numpy 数组上的数组操作
【发布时间】:2016-08-28 17:52:38
【问题描述】:

我需要一个高效的异构数组,其中第一个元素是 int,其余元素是浮点数。然而,在创建它之后,基本的数组操作正在爆炸式增长。

A = np.zeros(1, dtype='i4, f4, f4')
B = np.array([3,3,3])
A + B
TypeError: invalid type promotion

【问题讨论】:

  • 为什么不也提供 B 的 dtype?
  • dtype 语法是创建一三元组而不是一三元素数组。查看 np.zeros 的自定义 dtype。
  • @bejota 我不是这个意思。我的意思不是让它选择要使用的默认 int 类型,而是指定它或指定记录类型。如果您尝试为 B 提供 dtype 'i4, f4, f4',您得到的错误解释了为什么 OP 的原始请求没有意义(您需要字节来解释这样的数组)。所以使用记录类型并遍历字段。

标签: python arrays numpy


【解决方案1】:

对于这样的结构化数组,需要对字段进行迭代的操作通常不起作用。

即使将A 添加到自身也不起作用:

In [476]: A = np.zeros(1, dtype='i4, f4, f4')

In [477]: A+A
...
TypeError: ufunc 'add' did not contain a loop with signature matching types dtype([('f0', '<i4'), ('f1', '<f4'), ('f2', '<f4')]) ....

换句话说,有一种方法可以将int 添加到int,将float 添加到int,但不能将A 元素添加到另一个元素。

A 的元素是 tuplenumpy.void(取决于您访问它的方式)

In [478]: A.item()
Out[478]: (0, 0.0, 0.0)

In [479]: type(A.item())
Out[479]: tuple

In [480]: type(A[0])
Out[480]: numpy.void

要跨结构化数组的字段工作,您通常必须遍历字段名称。

In [493]: B=np.arange(3)

In [494]: for i,name in enumerate(A.dtype.names):
   A[name] = A[name]+B[i]
   .....: 

In [495]: A
Out[495]: 
array([(0, 1.0, 2.0)], 
      dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', '<f4')])

如果所有字段都具有相同的类型,例如dtype='i4, i4, i4',则可以将结构化数组视为同质 dtype,并对其执行常规数学运算。但是对于浮点数和整数的混合,这是不可能的。

【讨论】:

    猜你喜欢
    • 2016-06-06
    • 2018-11-30
    • 1970-01-01
    • 2012-04-10
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    相关资源
    最近更新 更多