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