python - Questions sur les opérations sur les tableaux NumPy
ringa_lee
ringa_lee 2017-06-30 09:56:09
0
3
1335
['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_lee
ringa_lee

ringa_lee

répondre à tous(3)
迷茫

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

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

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
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal