【问题标题】:find unique values at a given position in a numpy array of tuples在 numpy 元组数组中的给定位置查找唯一值
【发布时间】:2023-03-17 01:44:01
【问题描述】:

我有一个如下所示的 numpy 数组:

[
('{893EE51E-0CD1-4C06-B672-365EECA26C33}', 'image/jpeg', 'Photo1.jpg', []),
('{893EE51E-0CD1-4C06-B672-365EECA26C33}', 'image/jpeg', 'Photo2.jpg', []),
('{893EE51E-0CD1-4C06-B672-365EECA26C63}', 'image/jpeg', 'Photo1.jpg', []),
('{893EE51E-0CD1-4C06-B672-365EECA26C73}', 'image/jpeg', 'Photo1.jpg', [])
]

如何在每个元组的“位置 0”找到唯一值?理想情况下,我想输出一个如下所示的数组(或列表):

[
'{893EE51E-0CD1-4C06-B672-365EECA26C33}',
'{893EE51E-0CD1-4C06-B672-365EECA26C63}',
'{893EE51E-0CD1-4C06-B672-365EECA26C73}'
]

【问题讨论】:

  • dtype 是什么?如果它显示为元组列表,则它必须是结构化的。 arr['f0'] 是该数组中名为 f0'. You should be able to apply np.unique 的字段。
  • @hpaulj 当我打印 np 数组的 dtype 时,我得到了这个[('REL_GLOBALID', '<U38'), ('CONTENT_TYPE', '<U150'), ('ATT_NAME', '<U250'), ('DATA', 'V')]。当我做np.unique(np_array['REL_GLOBALID']) 时,我确实得到了唯一值数组。谢谢

标签: python numpy tuples unique


【解决方案1】:

从您的显示器重新创建结构化数组:

In [241]: _ = np.array([
     ...: ('{893EE51E-0CD1-4C06-B672-365EECA26C33}', 'image/jpeg', 'Photo1.jpg', []),
     ...: ('{893EE51E-0CD1-4C06-B672-365EECA26C33}', 'image/jpeg', 'Photo2.jpg', []),
     ...: ('{893EE51E-0CD1-4C06-B672-365EECA26C63}', 'image/jpeg', 'Photo1.jpg', []),
     ...: ('{893EE51E-0CD1-4C06-B672-365EECA26C73}', 'image/jpeg', 'Photo1.jpg', [])
     ...: ],dtype='U50,U20,U20,O')
Out[241]: 
array([('{893EE51E-0CD1-4C06-B672-365EECA26C33}', 'image/jpeg', 'Photo1.jpg', list([])),
       ('{893EE51E-0CD1-4C06-B672-365EECA26C33}', 'image/jpeg', 'Photo2.jpg', list([])),
       ('{893EE51E-0CD1-4C06-B672-365EECA26C63}', 'image/jpeg', 'Photo1.jpg', list([])),
       ('{893EE51E-0CD1-4C06-B672-365EECA26C73}', 'image/jpeg', 'Photo1.jpg', list([]))],
      dtype=[('f0', '<U50'), ('f1', '<U20'), ('f2', '<U20'), ('f3', 'O')])

选择第一个字段:

In [242]: _['f0']
Out[242]: 
array(['{893EE51E-0CD1-4C06-B672-365EECA26C33}',
       '{893EE51E-0CD1-4C06-B672-365EECA26C33}',
       '{893EE51E-0CD1-4C06-B672-365EECA26C63}',
       '{893EE51E-0CD1-4C06-B672-365EECA26C73}'], dtype='<U50')

对此应用unique

In [243]: np.unique(_)
Out[243]: 
array(['{893EE51E-0CD1-4C06-B672-365EECA26C33}',
       '{893EE51E-0CD1-4C06-B672-365EECA26C63}',
       '{893EE51E-0CD1-4C06-B672-365EECA26C73}'], dtype='<U50')

【讨论】:

    【解决方案2】:

    将 set() 与列表推导结合使用:

    x = [
    ('{893EE51E-0CD1-4C06-B672-365EECA26C33}', 'image/jpeg', 'Photo1.jpg', []),
    ('{893EE51E-0CD1-4C06-B672-365EECA26C33}', 'image/jpeg', 'Photo2.jpg', []),
    ('{893EE51E-0CD1-4C06-B672-365EECA26C63}', 'image/jpeg', 'Photo1.jpg', []),
    ('{893EE51E-0CD1-4C06-B672-365EECA26C73}', 'image/jpeg', 'Photo1.jpg', [])
    ]
    y = set(i[0] for i in x)
    y
    {'{893EE51E-0CD1-4C06-B672-365EECA26C63}',
     '{893EE51E-0CD1-4C06-B672-365EECA26C73}',
     '{893EE51E-0CD1-4C06-B672-365EECA26C33}'}
    

    【讨论】:

      【解决方案3】:

      在切片第一列后使用np.unique ([:, 0])

      >>> np.unique(arr[:,0])
      
      array(['{893EE51E-0CD1-4C06-B672-365EECA26C33}',
             '{893EE51E-0CD1-4C06-B672-365EECA26C63}',
             '{893EE51E-0CD1-4C06-B672-365EECA26C73}'], dtype=object)
      

      【讨论】:

      • 当我执行您建议的命令时,我收到以下错误消息。 IndexError:数组的索引过多。我正在使用 python 3.6.2
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-07
      • 2020-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-09
      相关资源
      最近更新 更多