2014-02-15 5 views
1

Я читаю данные для трех отдельных городов, и я хочу сохранить каждый набор данных в двумерном массиве, но по мере прохождения части моего кода циклы продолжают писать вещи из первых двух городов, поскольку у меня только одномерный массив. Где я должен настроить эти 2-D массивы, чтобы сохранить мои файлы и какие функции и аргументы использовать для этого?Двумерные массивы в Python

Массивы должны быть 3X54 (3 для каждого города, 54 за каждый год данных)

EDIT: Все исходные переменные в коде ниже (т.е. осадков, Tmin, Tmax) будет иметь более 19 000 элементов в них в начале которого я заканчиваю усреднение через год в коде.

import numpy as np 
import matplotlib.pyplot as plt 
import pandas as pd 

city = ['Lubbock.txt','Erie.txt','Oslo.txt'] 
years = np.arange(1960,2014,1) 
months_summer = range(5,8,1) 

for x in range(0,len(city),1): 

    data = np.genfromtxt(city[x], skip_header=2, usecols=(1), dtype=('S8')) 
    data2 = np.genfromtxt(city[x], skip_header=2, usecols=(2,3,4)) 

    #ONLY GET 1-D ARRAY WHEN I ASK FOR SHAPE OF VARIABLE AFTER THIS POINT 

    dates = pd.DatetimeIndex(data[:]) 
    year = dates.year 
    month = dates.month 
    day = dates.day 
    precip = data2[:,0]/10. 
    tmax = data2[:,1]/10. 
    tmin = data2[:,2]/10. 

    tmaxF = (tmax*(9./5.))+32. 
    tminF = (tmin*(9./5.))+32. 
    precipinches = precip*0.03937007874 

    tmax_avg = [] 

    JJA3tmax_avg = [] 

    JJAtmax_avg = [] 

    DJFtmax_avg = [] 

    for yr in years: 
     toavg = np.where(year == yr) 
     tmax_avg.append(np.average(tmax[toavg])) 


     for mo in months_summer: 
      sumtoavg = np.where(month == mo) 
      JJA3tmax_avg.append(np.average(tmax[sumtoavg])) 


     JJAtmax_avg.append(np.average(JJA3tmax_avg)) 
     JJA3tmax_avg = [] 

     dec_this_year = (year == yr) & (month == 12) 
     jan_next_year = (year == (yr+1)) & (month == 1) 
     feb_next_year = (year == (yr+1)) & (month == 2) 

     wintoavg = np.where(dec_this_year & jan_next_year & feb_next_year) 

     DJFtmax_avg.append(np.average(tmax[wintoavg])) 


    tmaxmean30 = np.average(tmax_avg[1:31]) 
    JJAtmaxmean30 = np.average(JJAtmax_avg[1:31]) 
    DJFtmaxmean30 = np.average(DJFtmax_avg[1:31]) 

#THIS IS THE DATA THAT I'M PLOTTING 
    tmax_avg_dep = tmax_avg - tmaxmean30 
    JJAtmax_avg_dep = JJAtmax_avg - JJAtmaxmean30 
    DJFtmax_avg_dep = DJFtmax_avg - DJFtmaxmean30 
+0

Вы импортирования 'pandas', но вы на самом деле не кажется, использует it-- в частности, не похоже, вы не должны принимать преимущество' groupby'. – DSM

+0

@DSM У вас есть предложения по использованию функции groupby здесь? Я не знаю панд хорошо и просто нашел эту функцию, чтобы иметь дело с 8-значным YYYYMMDD в моих данных в строку. – DJV

ответ

5

Эта линия:

data[:] 

создает неглубокую копию. Вам нужен deep copy:

import copy 
copy.deepcopy(data) 

Из документов:

Разница между мелким и глубоким копированием имеет значение только для составных объектов (объектов, которые содержат другие объекты, например, списки или экземпляры классов):

  • Неглубокая копия создает новый составной объект, а затем (насколько это возможно) вставляет ссылки на него в объекты, найденные в оригинале.
  • Глубокая копия создает новый составной объект, а затем рекурсивно вставляет в него копии объектов, найденных в оригинале.
+0

Однако размер данных не такой размер, как мне нужны мои массивы в конце. Там более 19 000 элементов. – DJV

+0

Много раз легче найти проблему, если вы кипятите код до [Минимальный, Полный, Проверенный и Читаемый] (http://stackoverflow.com/help/mcve). В противном случае это иголка в стоге сена. Устраните это до наименьшего количества кода, который демонстрирует проблему. – mhlester

+0

Готово. Все это только для одной из переменных. – DJV

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