【问题标题】:how to (simply) build a integer and float mixed numpy array如何(简单地)构建一个整数和浮点混合numpy数组
【发布时间】:2012-11-29 16:31:00
【问题描述】:

我只想创建一个大小为 (N,m) 的 numpy 数组,其中只有第一列由整数组成,其余的默认为浮点数。 因此,如果初始化为零,它应该是结果:

array([[ 0,  0.,  0.,  0.,  0.],
       [ 0,  0.,  0.,  0.,  0.],
       [ 0,  0.,  0.,  0.,  0.],
       [ 0,  0.,  0.,  0.,  0.],
       [ 0,  0.,  0.,  0.,  0.]])

在尝试创建这样一个结构化数组时,我所做的所有尝试都返回了一些元组子元素。

【问题讨论】:

  • 出于好奇,您为什么需要这样做?
  • 假设您必须存储一些混合数据,其中 1 个字段是整数(即离散状态),其他字段是真实的。
  • 但是你用这些数据做什么? 1 != 1.0 什么时候有问题?

标签: python multidimensional-array numpy


【解决方案1】:

您可以使用带有dtype = object 的数组:

>>> arr = np.ndarray((10,4),dtype = object)
>>> arr[:,0] = int(10)
>>> arr[:,1:] = float(10)
>>> arr
array([[10, 10.0, 10.0, 10.0],
       [10, 10.0, 10.0, 10.0],
       [10, 10.0, 10.0, 10.0],
       [10, 10.0, 10.0, 10.0],
       [10, 10.0, 10.0, 10.0],
       [10, 10.0, 10.0, 10.0],
       [10, 10.0, 10.0, 10.0],
       [10, 10.0, 10.0, 10.0],
       [10, 10.0, 10.0, 10.0],
       [10, 10.0, 10.0, 10.0]], dtype=object)

请注意,您在进行算术运算时会得到正确的行为。

>>> arr / 3
array([[3, 3.33333333333, 3.33333333333, 3.33333333333],
       [3, 3.33333333333, 3.33333333333, 3.33333333333],
       [3, 3.33333333333, 3.33333333333, 3.33333333333],
       [3, 3.33333333333, 3.33333333333, 3.33333333333],
       [3, 3.33333333333, 3.33333333333, 3.33333333333],
       [3, 3.33333333333, 3.33333333333, 3.33333333333],
       [3, 3.33333333333, 3.33333333333, 3.33333333333],
       [3, 3.33333333333, 3.33333333333, 3.33333333333],
       [3, 3.33333333333, 3.33333333333, 3.33333333333],
       [3, 3.33333333333, 3.33333333333, 3.33333333333]], dtype=object)

或者你可以使用numpy.recarray:

>>> import numpy as np
>>> arr = np.recarray(10,dtype=[('x',int),('y',float,4)])
>>> arr[:] = 0
>>> arr
rec.array([(0, array([ 0.,  0.,  0.,  0.])), (0, array([ 0.,  0.,  0.,  0.])),
           (0, array([ 0.,  0.,  0.,  0.])), (0, array([ 0.,  0.,  0.,  0.])),
           (0, array([ 0.,  0.,  0.,  0.])), (0, array([ 0.,  0.,  0.,  0.])),
           (0, array([ 0.,  0.,  0.,  0.])), (0, array([ 0.,  0.,  0.,  0.])),
           (0, array([ 0.,  0.,  0.,  0.])), (0, array([ 0.,  0.,  0.,  0.]))], 
  dtype=[('x', '<i4'), ('y', '<f8', (4,))])
>>> arr['x']
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
>>> arr['y']
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])

如果您需要对所有值进行算术运算,则必须分别对每个字段执行操作,例如

>>> arr['x'] += 2
>>> arr['y'] += 2

【讨论】:

  • 虽然请注意dtype=object 使数组与普通 Python 数组一样慢(并且占用大量内存)。
【解决方案2】:

虽然我能想到很多你一开始就不应该这样做的原因,但这不是我判断的,我讨厌人们试图降低我自己的快速'n'的价值肮脏的黑客。

理由是使用dtype=object。由于 Python 中的一切都是对象,因此您可以混合数字类型,同时仍保持数组内部的同质性。我建议以下,但您显然可以适应您的需求:

import numpy

rows = 5
a = numpy.zeros((rows,5)).astype(object)
a[:,0] = a[:,0].astype(int)
print a

[[0  0.0  0.0  0.0  0.0]
 [0  0.0  0.0  0.0  0.0]
 [0  0.0  0.0  0.0  0.0]
 [0  0.0  0.0  0.0  0.0]
 [0  0.0  0.0  0.0  0.0]]

【讨论】:

    【解决方案3】:

    在 numpy 文档中阅读此内容,这表明所有成员必须是同一类型

    NumPy 的主要对象是齐次多维数组。它是一个 元素表(通常是数字),所有相同类型,索引为 一个正整数元组。

    【讨论】:

      猜你喜欢
      • 2018-02-10
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多