84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
numpy 配列には合計で数万の要素があります。ここで、各要素の前にある番号 000001 などを保持し、重複を削除して一意の番号だけを残したいと考えています。結果は #['000001','000002','000003','000004'] となるはずです。for ステートメントを使用する以外に、より効率的な方法はありますか?
#['000001','000002','000003','000004']
ringa_lee
写个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')
还可以这样写:np.frompyfunc'|S6'是以6个字节存储字符串
np.frompyfunc
'|S6'
'<U6'是以6个小端序Unicode字符存储字符串
'<U6'
小端序Unicode字符
>>> b = np.array(np.unique(np.frompyfunc(lambda x:x[:6],1,1)(a)),dtype='<U6') >>> b array(['000001', '000002', '000003', '000004'], dtype='<U6')
综合两位仁兄的写法@同意并接受 @xiaojieluoff
如果编号长度固定是前六位,最快的写法下面第一种最快
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
使用 map 和匿名函数
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)
输出:
['000003', '000004', '000001', '000002']
运行下面代码可以看到 , 在 6百万 条数据下,map 比 for 快了 0.6s 左右
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))
map 运行时间:2.36173 for 运行时间:2.9405870000000003
如果把测试数据扩大到 6千万, 差距就更明显了
map 运行时间:29.620203 for 运行时间:33.132621
写个NumPy的吧~
python3
还可以这样写:
np.frompyfunc
'|S6'
是以6个字节存储字符串'<U6'
是以6个小端序Unicode字符
存储字符串综合两位仁兄的写法
@同意并接受 @xiaojieluoff
如果编号长度固定是前六位,最快的写法下面第一种最快
使用 map 和匿名函数
输出:
运行下面代码可以看到 , 在 6百万 条数据下,map 比 for 快了 0.6s 左右
输出:
如果把测试数据扩大到 6千万, 差距就更明显了