2016-05-22 3 views
3

Если у меня есть три Numpy массива:конкатенация Numpy элементы строки

a = np.array([[1, 2], [3, 4],[5,6]]) 
b = np.array([[7, 8], [9,10],[11,12]]) 
c = np.array([[13, 14], [15,16], [17,18]]) 
dstacker = np.dstack((a,b,c)) 

Я хочу сохранить это в файл в следующем формате:

1713, 2814, 3915, 41016, 51117, 61218 

Испробовав множество методов и Обыскав обмен стека исчерпывающе, Im в настоящее время тупик. Какие у меня варианты?

ответ

1

Может быть, это не самое элегантное решение, но я понял мою проблему форматирования, выполнив следующие действия с помощью от обильного члена здесь - Donkey Kong:

new_dstack_list =[''.join([hex(ele) for ele in row]) for dim in dstacker for row in dim] #supplied by Donkey Kong 

number_of_elements = len(new_dstack_list) 

for i in range(0,number_of_elements): 
    new_dstack_list[i] = new_dstack_list[i].replace(' ', '').replace('0x', '') 

сохранение файла:

with open(save_file_path,'w') as f: 
    f.write(",".join(list)) 
    f.close() 

и теперь выход:

17d,28e,39f,4a10,5b11,6c12 

Еще раз спасибо за помощь, то г дайте мне толчок в правильном направлении!

1

Вот Векторизованный подход после масштабирования каждого элемента с соответствующим 10-powered масштабирования и суммированием для имитации эффекта конкатенации -

# Calculate each elements number of digits 
pows = np.floor(np.log10(dstacker)).astype(int)+1 

# 10 powered scalings needed for each elements except the last column 
scale = (10**pows[:,:,1:])[:,:,::-1].cumprod(axis=-1)[:,:,::-1] 

# Finally get the concatenated number using the scalings and adding last col 
num = ((dstacker[:,:,:-1]*scale).sum(-1) + dstacker[:,:,-1]).ravel() 

Оставшейся работы написания 1D выходного массива num в файл.

Пример запуска -

In [7]: dstacker 
Out[7]: 
array([[[ 1, 27, 13], 
     [27800,  8, 14]], 

     [[54543, 559,  5], 
     [ 4, 10, 17776]], 

     [[ 5, 11, 17], 
     [ 6,  2, 18]]]) 

In [8]: pows = np.floor(np.log10(dstacker)).astype(int)+1 
    ...: scale = (10**pows[:,:,1:])[:,:,::-1].cumprod(axis=-1)[:,:,::-1] 
    ...: num = ((dstacker[:,:,:-1]*scale).sum(-1) + dstacker[:,:,-1]).ravel() 
    ...: 

In [9]: num 
Out[9]: array([ 12713, 27800814, 545435595, 41017776,  51117,  6218]) 
+0

Это хорошее решение. Любая идея обходного пути, когда один из элементов равен нулю? (Тогда суммарная сумма даст неверные значения) – akilat90

Смежные вопросы