是否可以在一个numpy记录数组中别名多个名称?

是否可以在一个numpy记录数组中别名多个名称?,numpy,Numpy,假设我像这样构造一个numpy记录数组 num_rows = <whatever> data = np.zeros( (num_rows,), dtype={ 'names':['apple', 'banana'], 'formats': ['f8', 'f8'] } 及 等等。 有办法给不同的名字取别名吗? 例如,我是否可以设置其他名称manzana data['manzana'] 是同一件事吗 data['apple']

假设我像这样构造一个numpy记录数组

num_rows = <whatever>
data = np.zeros(
    (num_rows,),
    dtype={
        'names':['apple', 'banana'],
        'formats': ['f8', 'f8']
    }

等等。 有办法给不同的名字取别名吗? 例如,我是否可以设置其他名称
manzana

data['manzana']
是同一件事吗

data['apple']

[“偏移量”和“标题”是给字段赋予不同名称的两种机制]

有一个
offset
参数可以这样工作。通常,它用于将另一个字段拆分为多个部分(例如,将int拆分为字节)。但它也适用于相同的字段。实际上,它定义了几个具有重叠数据的字段

In [743]: dt=np.dtype({'names':['apple','manzana','banana','guineo'],
       'formats':['f8','f8','f8','f8'], 
       'offsets':[0,0,8,8]})

In [745]: np.zeros((3,),dtype=dt)
Out[745]: 
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)], 
      dtype={'names':['apple','manzana','banana','guineo'], 
        'formats':['<f8','<f8','<f8','<f8'], 
        'offsets':[0,0,8,8], 'itemsize':16})

In [746]: A=np.zeros((3,),dtype=dt)

In [747]: A['banana']=[1,2,3]

In [748]: A
Out[748]: 
array([(0.0, 0.0, 1.0, 1.0),  
       (0.0, 0.0, 2.0, 2.0), 
       (0.0, 0.0, 3.0, 3.0)], 
      dtype={'names':['apple','manzana','banana','guineo'], 'formats':['<f8','<f8','<f8','<f8'], 'offsets':[0,0,8,8], 'itemsize':16})

In [749]: A['guineo']
Out[749]: array([ 1.,  2.,  3.])

In [750]: A['manzana']=[.1,.2,.3]

In [751]: A['apple']
Out[751]: array([ 0.1,  0.2,  0.3])

In [752]: A
Out[752]: 
array([(0.1, 0.1, 1.0, 1.0),  
       (0.2, 0.2, 2.0, 2.0), 
       (0.3, 0.3, 3.0, 3.0)], 
      dtype={'names':['apple','manzana','banana','guineo'], 'formats':['<f8','<f8','<f8','<f8'], 'offsets':[0,0,8,8], 'itemsize':16})

我已经将@hpaulj的答案放入了一个简单的方法中,并在这里分享,以防有人想使用它

def add_alias(arr, original, alias):
    """
    Adds an alias to the field with the name original to the array arr.
    Only one alias per field is allowed.
    """

    if arr.dtype.names is None:
        raise TypeError("arr must be a structured array. Use add_name instead.")
    descr = arr.dtype.descr

    try:
        index = arr.dtype.names.index(original)
    except ValueError:
        raise ValueError("arr does not have a field named '" + str(original) 
                         + "'")

    if type(descr[index][0]) is tuple:
        raise ValueError("The field " + str(original) + 
                         " already has an alias.")

    descr[index] = ((alias, descr[index][0]), descr[index][1])
    arr.dtype = np.dtype(descr)
    return arr

def add_name(arr, name):
    """
    Adds a name to the data of an unstructured array.
    """

    if arr.dtype.names is not None:
        raise TypeError("arr must not be a structured array. "
                        + "Use add_alias instead.")
    arr.dtype = np.dtype([(name, arr.dtype.name)])
    return arr

我知道,但我不明白这里的细节。看起来
banana
guineo
的偏移量为8。这是如何让苹果和manzana共享数据的?我可能遗漏了一些明显的东西。在相同的偏移量下,
apple
manzana
是共享数据的不同字段。但是我发现
标题
更接近你对别名的理解。
In [743]: dt=np.dtype({'names':['apple','manzana','banana','guineo'],
       'formats':['f8','f8','f8','f8'], 
       'offsets':[0,0,8,8]})

In [745]: np.zeros((3,),dtype=dt)
Out[745]: 
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)], 
      dtype={'names':['apple','manzana','banana','guineo'], 
        'formats':['<f8','<f8','<f8','<f8'], 
        'offsets':[0,0,8,8], 'itemsize':16})

In [746]: A=np.zeros((3,),dtype=dt)

In [747]: A['banana']=[1,2,3]

In [748]: A
Out[748]: 
array([(0.0, 0.0, 1.0, 1.0),  
       (0.0, 0.0, 2.0, 2.0), 
       (0.0, 0.0, 3.0, 3.0)], 
      dtype={'names':['apple','manzana','banana','guineo'], 'formats':['<f8','<f8','<f8','<f8'], 'offsets':[0,0,8,8], 'itemsize':16})

In [749]: A['guineo']
Out[749]: array([ 1.,  2.,  3.])

In [750]: A['manzana']=[.1,.2,.3]

In [751]: A['apple']
Out[751]: array([ 0.1,  0.2,  0.3])

In [752]: A
Out[752]: 
array([(0.1, 0.1, 1.0, 1.0),  
       (0.2, 0.2, 2.0, 2.0), 
       (0.3, 0.3, 3.0, 3.0)], 
      dtype={'names':['apple','manzana','banana','guineo'], 'formats':['<f8','<f8','<f8','<f8'], 'offsets':[0,0,8,8], 'itemsize':16})
In [792]: dt1=np.dtype({'names':['apple','banana'],'formats':['f8','f8'], 'titles':['manzana', 'guineo'], 'offsets':[0,8]})

In [793]: A1=np.zeros((3,),dtype=dt1)

In [794]: A1
Out[794]: 
array([(0.0, 0.0), (0.0, 0.0), (0.0, 0.0)], 
      dtype=[(('manzana', 'apple'), '<f8'), (('guineo', 'banana'), '<f8')])

In [795]: A1['apple']=[1,2,3]

In [796]: A1['guineo']=[.1,.2,.3]

In [797]: A1
Out[797]: 
array([(1.0, 0.1), (2.0, 0.2), (3.0, 0.3)], 
      dtype=[(('manzana', 'apple'), '<f8'), (('guineo', 'banana'), '<f8')])

In [798]: A1['banana']
Out[798]: array([ 0.1,  0.2,  0.3])
def add_alias(arr, original, alias):
    """
    Adds an alias to the field with the name original to the array arr.
    Only one alias per field is allowed.
    """

    if arr.dtype.names is None:
        raise TypeError("arr must be a structured array. Use add_name instead.")
    descr = arr.dtype.descr

    try:
        index = arr.dtype.names.index(original)
    except ValueError:
        raise ValueError("arr does not have a field named '" + str(original) 
                         + "'")

    if type(descr[index][0]) is tuple:
        raise ValueError("The field " + str(original) + 
                         " already has an alias.")

    descr[index] = ((alias, descr[index][0]), descr[index][1])
    arr.dtype = np.dtype(descr)
    return arr

def add_name(arr, name):
    """
    Adds a name to the data of an unstructured array.
    """

    if arr.dtype.names is not None:
        raise TypeError("arr must not be a structured array. "
                        + "Use add_alias instead.")
    arr.dtype = np.dtype([(name, arr.dtype.name)])
    return arr