cari

Rumah  >  Soal Jawab  >  teks badan

python - Soalan tentang operasi tatasusunan 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']

tatasusunan numpy, dengan jumlah puluhan ribu elemen. Sekarang saya mahu mengekalkan nombor 000001 atau sebagainya di hadapan setiap elemen, dan mengalih keluar pendua, hanya meninggalkan nombor unik. Hasilnya sepatutnya ['000001','000002','000003','000004']
Selain menggunakan pernyataan for, adakah cara yang lebih berkesan?

ringa_leeringa_lee2705 hari yang lalu1317

membalas semua(3)saya akan balas

  • 迷茫

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

    Jom tulis 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')

    Anda juga boleh menulisnya seperti ini: np.frompyfunc
    '|S6' ialah untuk menyimpan rentetan dalam 6 bait

    '<U6'是以6个小端序Unicode字符Simpan tali

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

    balas
    0
  • 学习ing

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

    Berdasarkan kaedah penulisan dua beradik
    @setuju dan terima @xiaojieluoff

    Jika panjang nombor ditetapkan kepada enam digit pertama, cara terpantas untuk menulisnya ialah yang pertama di bawah

    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
    

    balas
    0
  • 某草草

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

    Gunakan peta dan fungsi tanpa nama

    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)

    Keluaran:

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

    Jalankan kod berikut dan anda dapat melihat bahawa dengan 6 juta keping data, peta adalah kira-kira 0.6s lebih pantas daripada

    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))
    

    Keluaran:

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

    Jika data ujian dikembangkan kepada 60 juta, jurang akan menjadi lebih jelas

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

    balas
    0
  • Batalbalas