2015-12-04 4 views
1

Я работаю с большим набором данных, и я хотел бы создать новый массив, добавив столбцы, обновив массив, открыв новый файл, извлекая из него кусок и добавив его в мой новый массив. Я пробовал так:Обновление массива numpy путем добавления столбцов

import numpy as np 
Powers = np.array([]) 
with open('paths powers.tex', 'r') as paths_list: 
    for file_path in paths_list: 
     with open(file_path.strip(), 'r') as file: 
      data = np.loadtxt(file_path.strip()) 
      Pname = data[0:32446,0] 
      Powers = np.append(Powers,Pname, axis = 1) 
      np.savetxt("Powers.txt", Powers) 

Но что она делает здесь просто добавить материал из PNAME в нижней части массива, что делает большой 1D массив вместо добавления новых столбцов и создания многомерного массива. Я также пробовал это с numpy.insert, numpy.hstack и numpy.concatenate, и я попытался изменить форму Pname. Все они дают мне тот же результат.

+1

Если вы хотите «присоединить» или иначе объединить по оси «= = 1», вам нужно начать с массивов, имеющих не менее 2 осей. 'Powers = np.zeros ((32446,1))' – hpaulj

ответ

1

Вы попробовали numpy.column_stack?

Powers = np.column_stack([Powers,Pname]) 

Однако массив пуст первым, поэтому убедитесь, что массив не пуст, прежде чем конкатенации или вы получите ошибку измерения рассогласования:

import numpy as np 
Powers = np.array([]) 
with open('paths powers.tex', 'r') as paths_list: 
    for file_path in paths_list: 
     with open(file_path.strip(), 'r') as file: 
      data = np.loadtxt(file_path.strip()) 
      Pname = data[0:32446,0] 
      if len(Powers) == 0: 
       Powers = Pname[:,None] 
      else: 
       Powers = np.column_stack([Powers,Pname]) 
      np.savetxt("Powers.txt", Powers) 

len(Powers) будет проверять количество строк которые существуют в Powers. В начале это должно быть 0, поэтому на первой итерации это верно, и нам нужно будет явно сделать Powers равным двухмерному массиву с одним столбцом, который состоит из первого столбца в вашем файле. Powers = Pname[:,None] поможет вам сделать это, то же самое, что и Powers = Pname[:,np.newaxis]. Это преобразует 1D-массив в 2D-массив с одноэлементным столбцом. Теперь проблема заключается в том, что когда у вас есть 1D массивы в numpy, они агностически связаны с тем, являются ли они строками или столбцами. Поэтому перед добавлением необходимо явно преобразовать массивы в столбцы. numpy.column_stack позаботится об этом.

Однако вам также необходимо убедиться, что Powers является двумерной матрицей с одним столбцом при первом итерации цикла. Если вы не хотите использовать numpy.column_stack, вы все равно можете использовать numpy.append, но убедитесь, что то, что вы конкатенируете с массивом, - это столбец. То, что мы говорили выше, должны помочь вам сделать это:

import numpy as np 
Powers = np.array([]) 
with open('paths powers.tex', 'r') as paths_list: 
    for file_path in paths_list: 
     with open(file_path.strip(), 'r') as file: 
      data = np.loadtxt(file_path.strip()) 
      Pname = data[0:32446,0] 
      if len(Powers) == 0: 
       Powers = Pname[:,None] 
      else:  
       Pname = Pname[:,None] 
       Powers = np.append(Powers, Pname, axis=1) 
      np.savetxt("Powers.txt", Powers) 

второе утверждение гарантирует, что массив становится 2D массив с одноплодной колонки перед конкатенации.

+0

Да, я сделал! Должен был упомянуть об этом. Он не будет работать, даст мне ошибку: «все размеры входного массива, кроме оси конкатенации, должны точно совпадать» Проблема, я думаю, в том, что в первом запуске Powers пуст, поэтому он не имеет таких же размеров, как PNAME. Спасибо за предложение! – user90465

+0

@ user90465 ах да, теперь это имеет смысл. Попробуйте мое редактирование. На первой итерации мы инициализируем 'Powers' как одноэлементный 2D-массив с 1 столбцом, а затем добавляем оттуда. – rayryeng

+0

Что вы имеете в виду, проверяя, сначала ли массив пуст? Я попробовал ваше редактирование, но теперь я продолжаю получать сообщение о том, что размеры не соответствуют – user90465

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