python - Soalan tentang operasi tatasusunan NumPy
ringa_lee
ringa_lee 2017-06-30 09:56:09
0
3
1315
['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_lee
ringa_lee

ringa_lee

membalas semua(3)
迷茫

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')
学习ing

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
某草草

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
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan