Python Coding Tricks

1. Python 二維數組 數據類型轉換

>>> a = [['1','2','5','6','8'],['4', '5', '8', '5', '8']]
>>> map(map, [float, float], a)
15: [[1.0, 2.0, 5.0, 6.0, 8.0], [4.0, 5.0, 8.0, 5.0, 8.0]]
>>> map(map, [int, int], a)
16: [[1, 2, 5, 6, 8], [4, 5, 8, 5, 8]]

2. Python多線程並行執行

利用map和multiprocessing包

from multiprocessing.dummy import Pool as ThreadPool

pool = ThreadPool(4) # Sets the pool size to 4 默認爲電腦cpu核數
float_list = [1.0, 2.0, 3.0, 4.0]
int_list = pool.map(int, float_list)
pool.close()
pool.join()

3. 帶命令行參數

if __name__ == '__main__':
    PARSER = argparse.ArgumentParser(description="Parameters for the script.")

    PARSER.add_argument('-d', "--diagnostics", action="store_true",
                        help="Compute diagnostics.")
    PARSER.add_argument('-i', "--iter", type=int, default=1,
                        help="Number of iterations for averaging.")
    PARSER.add_argument("-f", "--outputfile", default="",
    PARSER.add_argument('-v', "--verbose", action="store_true",
                        help="Show computation steps.")

    PARSER.set_defaults(argument_default=False)
    CONFIG = PARSER.parse_args()
    CONFIG.stack = CONFIG.stack or CONFIG.fwls
    you_own_func(CONFIG)

4. 二進制文件讀寫

使用struct包

import struct
import numpy as np
path = 'db_pca_512.bin'

with open(path, 'rb') as f:
    db_num = np.uint32(struct.unpack('I', f.read(4)) )[0]
    db_fea_size = np.uint32(struct.unpack('I', f.read(4)))[0]

    A = np.zeros((db_num, db_fea_size), 'float32')
    for i in xrange(db_num):
        print i
        for j in xrange(db_fea_size):
            A[i, j] = np.float32(struct.unpack('I', f.read(4)))[0]

struct.unpack()解碼成python變量

a,b,c,d=struct.unpack('5s6sif',bytes)

‘5s6sif’這個叫做fmt,就是格式化字符串,由數字加字符構成,5s表示佔5個字符的字符串,2i,表示2個整數等等,下面是可用的字符及類型,ctype表示可以與python中的類型一一對應。

Format C Type Python 字節數
x pad byte no value 1
c char string of length 1 1
b signed char integer 1
B unsigned char integer 1
? _Bool bool 1
h short integer 2
H unsigned short integer 2
i int integer 4
I unsigned int integer or long 4
l long integer 4
L unsigned long long 4
q long long long 8
Q unsigned long long long 8
f float float 4
d double float 8
s char[] string 1
p char[] string 1
P void * long

5. range() 和 xrange()

range([start,] stop[, step]),根據start與stop指定的範圍以及step設定的步長,生成一個序list,xrange 用法與 range 完全相同,所不同的是生成的不是一個list對象,而是一個生成器。要生成很大的數字序列的時候,用xrange會比range性能優很多,因爲不需要一上來就開闢一塊很大的內存空間。
xrange 和 range 這兩個基本上都是在循環的時候用:

for i in range(0, 100):
    print i

for i in xrange(0, 100):
    print i

6. 使用PIL獲取文件夾下所有圖片,並使用tensorflow中的TFRecords序列化

TFRecords文件包含了tf.train.Example 協議內存塊(protocol buffer)(協議內存塊包含了字段 Features)。我們可以寫一段代碼獲取你的數據, 將數據填入到Example協議內存塊(protocol buffer),將協議內存塊序列化爲一個字符串, 並且通過tf.python_io.TFRecordWriter 寫入到TFRecords文件。

從TFRecords文件中讀取數據, 可以使用tf.TFRecordReader的tf.parse_single_example解析器。這個操作可以將Example協議內存塊(protocol buffer)解析爲張量。

import os
import tensorflow as tf 
from PIL import Image

cwd = os.getcwd()

'''
此處加載的數據目錄如下:
-- img1.jpg
     img2.jpg
     img3.jpg
     ...
-- img1.jpg
     img2.jpg
     ...
-- ...
...
'''
writer = tf.python_io.TFRecordWriter("train.tfrecords")
for index, name in enumerate(classes):
    class_path = cwd + name + "/"
    for img_name in os.listdir(class_path):
        img_path = class_path + img_name
            img = Image.open(img_path)
            img = img.resize((224, 224))
        img_raw = img.tobytes()              #將圖片轉化爲原生bytes
        example = tf.train.Example(features=tf.train.Features(feature={
            "label": tf.train.Feature(int64_list=tf.train.Int64List(value=[index])),
            'img_raw': tf.train.Feature(bytes_list=tf.train.BytesList(value=[img_raw]))
        }))
        writer.write(example.SerializeToString())  #序列化爲字符串
writer.close()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章