Maison  >  Questions et réponses  >  le corps du texte

python - Questions sur les opérations sur les tableaux NumPy

['000001_2017-03-17.csv', '000001_2017-03-20.csv',
 '000002_2017-03-21.csv', '000002_2017-03-22.csv',
 '000003_2017-03-23.csv', '000004_2017-03-24.csv']

tableau numpy, avec un total de dizaines de milliers d'éléments. Maintenant, je souhaite conserver le numéro 000001 ou similaire devant chaque élément et supprimer les doublons, ne laissant qu'un numéro unique. Le résultat devrait être ['000001','000002','000003','000004']
En plus d'utiliser l'instruction for, existe-t-il un moyen plus efficace ?

ringa_leeringa_lee2667 Il y a quelques jours1289

répondre à tous(3)je répondrai

  • 迷茫

    迷茫2017-06-30 09:58:09

    Écrivons NumPy~

    python3

    >>> import numpy as np
    >>> a = np.array(['000001_2017-03-17.csv', '000001_2017-03-20.csv',
     '000002_2017-03-21.csv', '000002_2017-03-22.csv',
     '000003_2017-03-23.csv', '000004_2017-03-24.csv'])
    
    >>> b = np.unique(np.fromiter(map(lambda x:x.split('_')[0],a),'|S6'))
    >>> b
    array([b'000001', b'000002', b'000003', b'000004'], 
          dtype='|S6')

    Vous pouvez également l'écrire comme ceci : np.frompyfunc
    '|S6' consiste à stocker la chaîne sur 6 octets

    '<U6'是以6个小端序Unicode字符Ficelle de magasin

    >>> b = np.array(np.unique(np.frompyfunc(lambda x:x[:6],1,1)(a)),dtype='<U6')
    >>> b
    array(['000001', '000002', '000003', '000004'], 
          dtype='<U6')

    répondre
    0
  • 学习ing

    学习ing2017-06-30 09:58:09

    Basé sur les méthodes d'écriture des deux frères
    @agree and accept @xiaojieluoff

    Si la longueur du nombre est fixée aux six premiers chiffres, la manière la plus rapide de l'écrire est le premier ci-dessous

    import time
    lst = ['000001_2017-03-17.csv', '000001_2017-03-20.csv', '000002_2017-03-21.csv', '000002_2017-03-22.csv', '000003_2017-03-23.csv', '000004_2017-03-24.csv'] * 1000000
    
    start = time.time()
    data = {_[:6] for _ in lst}
    print 'dic: {}'.format(time.time() - start)
    
    start = time.time()
    data = set(_[:6] for _ in lst)
    print 'set: {}'.format(time.time() - start)
    
    start = time.time()
    data = set(map(lambda _: _[:6], lst))
    print('map:{}'.format(time.time() - start))
    
    start = time.time()
    data = set()
    [data.add(_[:6]) for _ in lst]
    print('for:{}'.format(time.time() - start))
    
    耗时:
    dic: 0.72798705101
    set: 0.929664850235
    map:1.89214396477
    for:1.76194214821
    

    répondre
    0
  • 某草草

    某草草2017-06-30 09:58:09

    Utilisez la carte et les fonctions anonymes

    lists = ['000001_2017-03-17.csv', '000001_2017-03-20.csv','000002_2017-03-21.csv','000002_2017-03-22.csv','000003_2017-03-23.csv', '000004_2017-03-24.csv']
    
    data = list(set(map(lambda x:x.split('_')[0], lists)))
    
    print(data)

    Sortie :

    ['000003', '000004', '000001', '000002']

    Exécutez le code suivant et vous verrez qu'avec 6 millions de données, la carte est environ 0,6 seconde plus rapide que pour

    import time
    
    
    lists = ['000001_2017-03-17.csv', '000001_2017-03-20.csv', '000002_2017-03-21.csv', '000002_2017-03-22.csv', '000003_2017-03-23.csv', '000004_2017-03-24.csv'] * 1000000
    
    map_start = time.clock()
    
    map_data = list(set(map(lambda x:x.split('_')[0], lists)))
    
    
    map_end = (time.clock() - map_start)
    
    print('map 运行时间:{}'.format(map_end))
    
    
    for_start = time.clock()
    
    data = set()
    for k in lists:
        data.add(k.split('_')[0])
    
    for_end = (time.clock() - for_start)
    print('for 运行时间:{}'.format(for_end))
    

    Sortie :

    map 运行时间:2.36173
    for 运行时间:2.9405870000000003

    Si les données de test sont étendues à 60 millions, l'écart sera encore plus évident

    map 运行时间:29.620203
    for 运行时间:33.132621
    

    répondre
    0
  • Annulerrépondre