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

将fields/dtype应用于表示排序点的数组,然后删除fields/dtype?

  •  1
  • KDecker  · 技术社区  · 3 年前

    (x, y, z) 点数

    x = np.array([
        [0, 1, 0],
        [0, 2, 1],
        [1, 1, 0],
        [1, 2, 1],
        [2, 1, 0],
        [2, 2, 1]
    ])
    

    我想使用 numpy.sort sort 这些点没有实现一些专门的字段/d类型, numpy 重新排列点的轴

    x.sort(axis=0)
    

    结果

    [[0 1 0]
    [0 1 0]
    [1 1 0]
    [1 2 1]
    [2 2 1]
    [2 2 1]]
    

    dtype 基于某些字段定义

    point_dtype = [('x', float), ('y', float), ('z', float)]
    

    数据类型

    point_dtype = [('x', float), ('y', float), ('z', float)]
    x = np.array([
        (0, 1, 0),
        (0, 2, 1),
        (1, 1, 0),
        (1, 2, 1),
        (2, 1, 0),
        (2, 2, 1)
    ], dtype=point_dtype)
    x.sort(axis=0, order=['x', 'y'])
    

    结果是对有意义的点进行排序

    [(0., 1., 0.) (0., 2., 1.) (1., 1., 0.) (1., 2., 1.) (2., 1., 0.) (2., 2., 1.)]
    

    x 从上面定义的例子来看,它相当大( (18M, 3) ). 我不太清楚我怎样才能“申请”这份工作 point_dtype 如前所述。

    如果我试图 astype 我的阵法 努比

    point_dtype = [('x', float), ('y', float), ('z', float)]
    x = np.array([
        [0, 1, 0],
        [0, 2, 1],
        [1, 1, 0],
        [1, 2, 1],
        [2, 1, 0],
        [2, 2, 1]
    ])
    x = x.astype(point_dtype)
    

    结果 看起来像

     [[(0., 0., 0.) (1., 1., 1.) (0., 0., 0.)]
     [(0., 0., 0.) (2., 2., 2.) (1., 1., 1.)]
     [(1., 1., 1.) (1., 1., 1.) (0., 0., 0.)]
     [(1., 1., 1.) (2., 2., 2.) (1., 1., 1.)]
     [(2., 2., 2.) (1., 1., 1.) (0., 0., 0.)]
     [(2., 2., 2.) (2., 2., 2.) (1., 1., 1.)]]
    

    [(0., 1., 0.) (0., 2., 1.) (1., 1., 0.) (1., 2., 1.) (2., 1., 0.) (2., 2., 1.)]
    

    我如何追溯申请专业 数据类型 一个已经存在的 努比 阵列?

    numpy.astype ,尽管没有一个可能的参数能够解决这种情况。我还找到了 努比 文件 structured arrays 尽管如此,似乎没有任何东西可以追溯到

    此外, 我怎样才能去掉这个 数据类型 获取“原始”数组表示?

    1 回复  |  直到 3 年前
        1
  •  2
  •   juanpa.arrivillaga    3 年前

    创建 要高效地创建共享基础缓冲区的对象,请执行以下操作:

    >>> x = np.array([
    ...     [0, 1, 0],
    ...     [0, 2, 1],
    ...     [1, 1, 0],
    ...     [1, 2, 1],
    ...     [2, 1, 0],
    ...     [2, 2, 1]
    ... ], dtype=np.float64)
    >>> x
    array([[0., 1., 0.],
           [0., 2., 1.],
           [1., 1., 0.],
           [1., 2., 1.],
           [2., 1., 0.],
           [2., 2., 1.]])
    >>> point_dtype = [('x', float), ('y', float), ('z', float)]
    >>> x.view(point_dtype)
    array([[(0., 1., 0.)],
           [(0., 2., 1.)],
           [(1., 1., 0.)],
           [(1., 2., 1.)],
           [(2., 1., 0.)],
           [(2., 2., 1.)]], dtype=[('x', '<f8'), ('y', '<f8'), ('z', '<f8')])
    

    注意,视图是独立的 python对象 :

    >>> x is view
    False
    

    但它有着相同的潜在缓冲:

    >>> x[0,0] = 99
    >>> view
    array([[(99., 1., 0.)],
           [( 0., 2., 1.)],
           [( 1., 1., 0.)],
           [( 1., 2., 1.)],
           [( 2., 1., 0.)],
           [( 2., 2., 1.)]], dtype=[('x', '<f8'), ('y', '<f8'), ('z', '<f8')])
    >>>
    

    >>> x.dtype = point_dtype
    >>> x
    array([[(99., 1., 0.)],
           [( 0., 2., 1.)],
           [( 1., 1., 0.)],
           [( 1., 2., 1.)],
           [( 2., 1., 0.)],
           [( 2., 2., 1.)]], dtype=[('x', '<f8'), ('y', '<f8'), ('z', '<f8')])
    >>> x.dtype = np.float64
    >>> x
    array([[99.,  1.,  0.],
           [ 0.,  2.,  1.],
           [ 1.,  1.,  0.],
           [ 1.,  2.,  1.],
           [ 2.,  1.,  0.],
           [ 2.,  2.,  1.]])
    
        2
  •  0
  •   hpaulj    3 年前

    np.lexsort 你想要什么(我想):

    In [23]: np.lexsort((x[:,1],x[:,0]))
    Out[23]: array([0, 1, 2, 3, 4, 5])
    In [24]: x[_,:]
    Out[24]: 
    array([[0, 1, 0],
           [0, 2, 1],
           [1, 1, 0],
           [1, 2, 1],
           [2, 1, 0],
           [2, 2, 1]])
    

    最近的numpy版本添加了 unstructured_to_structured 函数,使创建结构化数组更容易。但它并没有形成一种观点。

    In [40]: import numpy.lib.recfunctions as rf
    In [41]: X = rf.unstructured_to_structured(x,  np.dtype([('x', '<f8'), ('y', '<f8'), ('z', '<f8')]))
    In [42]: X
    Out[42]: 
    array([(0., 1., 0.), (0., 2., 1.), (1., 1., 0.), (1., 2., 1.),
           (2., 1., 0.), (2., 2., 1.)],
          dtype=[('x', '<f8'), ('y', '<f8'), ('z', '<f8')])
    In [43]: X.sort(order=['x','y'])
    In [44]: X
    Out[44]: 
    array([(0., 1., 0.), (0., 2., 1.), (1., 1., 0.), (1., 2., 1.),
           (2., 1., 0.), (2., 2., 1.)],
          dtype=[('x', '<f8'), ('y', '<f8'), ('z', '<f8')])