代码之家  ›  专栏  ›  技术社区  ›  dassouki

指定python numpy数组中每个对象的数据类型

  •  6
  • dassouki  · 技术社区  · 14 年前

    下面的代码片段创建了一个“典型的测试数组”,这个数组的目的是在我的程序中测试各种各样的东西。是否有方法或者甚至可以更改数组中元素的类型?

    import numpy as np
    import random
    from random import uniform, randrange, choice
    
    # ... bunch of silly code ...
    
    def gen_test_array( ua, low_inc, med_inc, num_of_vectors ):
      #typical_array = [ zone_id, ua, inc, veh, pop, hh, with_se, is_cbd, re, se=0, oe]
      typical_array = np.zeros( shape = ( num_of_vectors, 11 ) )
    
      for i in range( 0, num_of_vectors ):
        typical_array[i] = [i, int( ua ), uniform( low_inc / 2, med_inc * 2 ), uniform( 0, 6 ),
                            randrange( 100, 5000 ), randrange( 100, 500 ),
                            choice( [True, False] ), choice( [True, False] ),
                            randrange( 100, 5000 ), randrange( 100, 5000 ),
                            randrange( 100, 5000 ) ]
    
      return typical_array
    
    2 回复  |  直到 14 年前
        1
  •  8
  •   Joe Kington    9 年前

    在numpy中这样做的方法是使用 structured array .

    但是,在许多情况下,在使用异构数据的情况下,简单的python列表是 许多的 更好的选择。(或者,尽管在写下这个答案时还没有广泛获得,但是 pandas.DataFrame 非常适合这种情况。)

    无论如何,上面给出的示例将作为“普通”numpy数组完美工作。在您给出的示例中,可以将所有内容都设置为浮点型。(除了两列浮点数之外,所有东西都是int…喷杆可以很容易地表示为整数。)

    然而,为了说明使用结构化数据类型…

    import numpy as np
    
    ua = 5 # No idea what "ua" is in your code above...
    low_inc, med_inc = 0.5, 2.0 # Again, no idea what these are...
    
    num = 100
    num_fields = 11
    
    # Use more descriptive names than "col1"! I'm just generating the names as placeholders
    dtype = {'names':['col%i'%i for i in range(num_fields)],
                     'formats':2*[np.int] + 2*[np.float] + 2*[np.int] + 2*[np.bool] + 3*[np.int]}
    data = np.zeros(num, dtype=dtype)
    
    # Being rather verbose...
    data['col0'] = np.arange(num, dtype=np.int)
    data['col1'] = int(ua) * np.ones(num)
    data['col2'] = np.random.uniform(low_inc / 2, med_inc * 2, num)
    data['col3'] = np.random.uniform(0, 6, num)
    data['col4'] = np.random.randint(100, 5000, num)
    data['col5'] = np.random.randint(100, 500, num)
    data['col6'] = np.random.randint(0, 2, num).astype(np.bool)
    data['col7'] = np.random.randint(0, 2, num).astype(np.bool)
    data['col8'] = np.random.randint(100, 5000, num)
    data['col9'] = np.random.randint(100, 5000, num)
    data['col10'] = np.random.randint(100, 5000, num)
    
    print data
    

    它生成一个包含11个字段的100元素数组:

    array([ (0, 5, 2.0886534380436226, 3.0111285613794276, 3476, 117, False, False, 4704, 4372, 4062),
           (1, 5, 2.0977199579338115, 1.8687472941590277, 4635, 496, True, False, 4079, 4263, 3196),
           ...
           ...
           (98, 5, 1.1682309811443277, 1.4100766819689299, 1213, 135, False, False, 1250, 2534, 1160),
           (99, 5, 1.746554619056416, 5.210411489007637, 1387, 352, False, False, 3520, 3772, 3249)], 
          dtype=[('col0', '<i8'), ('col1', '<i8'), ('col2', '<f8'), ('col3', '<f8'), ('col4', '<i8'), ('col5', '<i8'), ('col6', '|b1'), ('col7', '|b1'), ('col8', '<i8'), ('col9', '<i8'), ('col10', '<i8')])
    
        2
  •  4
  •   mtrw    14 年前

    引用第1章第1行 the NumPy reference:

    NumPy provides an N-dimensional array type, the ndarray, which describes a collection of “items” of the same type.
    

    所以数组的每个成员都必须是相同的类型。与常规的python列表相比,这里的通用性损失在于允许对数组进行高速操作的权衡:循环可以在不测试每个成员类型的情况下运行。