【问题标题】:Numpy hybrid type Matrix astypeNumpy 混合类型 Matrix astype
【发布时间】:2015-05-09 15:29:43
【问题描述】:

我正在尝试转换我已经定义的 numpy 矩阵:

    matrix = numpy.array([['name','23','45','1'],
                         ['name2','223','43','5'],
                         ['name3','12','33','2']])

导致:

array([['name1', '23', '45', '1'],
       ['name2', '223', '43', '5'],
       ['name3', '12', '33', '2']], 
      dtype='|S5')

我想命名矩阵的每一列并将其转换为以下类型:

dt = numpy.dtype({'names':['name','x','y','n'],'formats': ['S10', 'S10', 'S10', 'S10']})

现在,我将考虑矩阵所有字符串,因为它不起作用,但是像 'formats': ['S10', 'f3', 'f3', 'i'] 这样的格式是预期的 并做这样的事情:

matrix.astype(dtype=dt,casting='safe')

结果:

array([[('name', 'name', 'name', 'name'), ('23', '23', '23', '23'),
        ('45', '45', '45', '45'), ('1', '1', '1', '1')],
       [('name2', 'name2', 'name2', 'name2'), ('223', '223', '223', '223'),
        ('43', '43', '43', '43'), ('5', '5', '5', '5')],
       [('name3', 'name3', 'name3', 'name3'), ('12', '12', '12', '12'),
        ('33', '33', '33', '33'), ('2', '2', '2', '2')]], 
      dtype=[('name', 'S10'), ('x', 'S10'), ('y', 'S10'), ('n', 'S10')])

我错过了什么?如何使用 numpy 模块为每个矩阵列定义类型?

【问题讨论】:

    标签: python numpy matrix


    【解决方案1】:

    创建/填充结构化数组有点棘手。有多种方法,但我认为最容易记住的是使用元组列表:

    In [11]: np.array([tuple(row) for row in matrix], dtype=dt)
    Out[11]: 
    array([('name', '23', '45', '1'), 
           ('name2', '223', '43', '5'),
           ('name3', '12', '33', '2')], 
          dtype=[('name', 'S10'), ('x', 'S10'), ('y', 'S10'), ('n', 'S10')])
    

    结果是一维数组,其中 dtype 字段替换了原始二维数组的列。新数组的每个元素都具有相同的类型 - 由 dt 指定。

    或者您可以创建一个所需数据类型的空数组,然后逐行或逐字段填充它:

    In [14]: arr = np.zeros((3,),dt)    
    In [16]: arr[0]=tuple(matrix[0,:])  # tuple of row
    In [17]: arr['name']=matrix[:,0]    # field
    
    In [18]: arr
    Out[18]: 
    array([('name', '23', '45', '1'), 
           ('name2', '', '', ''),
           ('name3', '', '', '')], 
          dtype=[('name', 'S10'), ('x', 'S10'), ('y', 'S10'), ('n', 'S10')])
    

    使用兼容的dt1view 也可以工作

    dt1 = numpy.dtype({'names':['name','x','y','n'],'formats': ['S5', 'S5', 'S5', 'S5']})
    matrix.view(dt1)
    

    这不会改变数据;它只是以不同的方式解释字节。


    使用元组列表将字符串转换为数字很容易

    In [40]: dt2 = numpy.dtype({'names':['name','x','y','n'],'formats': ['S5', 'f', 'f', 'i']})
    
    In [41]: np.array([tuple(row) for row in matrix], dtype=dt2)Out[41]: 
    array([('name', 23.0, 45.0, 1), 
           ('name2', 223.0, 43.0, 5),
           ('name3', 12.0, 33.0, 2)], 
          dtype=[('name', 'S5'), ('x', '<f4'), ('y', '<f4'), ('n', '<i4')])
    

    【讨论】:

    • 其中一种方法显示了一个矩阵。我的问题与二维数组有关,在我的情况下,它的形状应该是 (3,4) 而不是 (3,)
    • 但是您的dtype 指定了4 个字段,而您在源中只有4 列数据。是否要将值复制到新二维数组的每一列?
    • 请不要考虑我的 dtype,主要问题是“如何使用 numpy 模块为每个矩阵列定义类型?”
    • 您不能逐列指定类型。它是数组中每个元素的一个 dtype。
    • 没有其他方法可以转换 2dArray 的每一列吗?
    猜你喜欢
    • 2016-04-12
    • 2014-09-10
    • 2017-06-21
    • 1970-01-01
    • 2019-04-03
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    相关资源
    最近更新 更多