【问题标题】:specify dtype of each object in a python numpy array在 python numpy 数组中指定每个对象的 dtype
【发布时间】:2011-04-13 05:53:10
【问题描述】:

下面的 sn -p 创建一个“典型的测试数组”,这个数组的目的是测试我程序中的各种各样的东西。有没有办法或者甚至可以改变数组中元素的类型?

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

【问题讨论】:

    标签: python arrays numpy scipy


    【解决方案1】:

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

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

    所以数组的每个成员都必须是相同的类型。与常规 Python 列表相比,这里失去了一般性,这是允许对数组进行高速操作的权衡:无需测试每个成员的类型即可运行循环。

    【讨论】:

    • 除了使用 np.array 还有其他选择吗?
    • 你到底想做什么?我认为 numpy 可以加速数学运算:矩阵乘法,或者取一大堆输入的余弦。在不知道你在做什么的情况下,我只能建议一个常规的 Python 列表。
    【解决方案2】:

    在 numpy 中执行此操作的方法是使用 structured array

    但是,在许多使用异构数据的情况下,简单的 python 列表是一个非常更好的选择。 (或者,尽管在编写此答案时它并未广泛使用,但 pandas.DataFrame 绝对适合这种情况。)

    无论如何,您上面给出的示例将完美地作为“正常”的 numpy 数组工作。您可以在您给出的示例中使所有内容成为浮动。 (除了两列浮点数之外,一切似乎都是 int ...... bool 可以很容易地表示为 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')])
    

    【讨论】:

      猜你喜欢
      • 2019-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 2022-01-26
      相关资源
      最近更新 更多