2017-01-25 56 views
1

我是python的新手,並試圖弄清楚如何遍歷2x2矩陣。如何在條件下循環二維矩陣

我的起點是一個* .csv文件,其中包含大量數據(10列173828行)。因爲我只需要第一列(sigma_0值)和第六列(日期),我做了一個叫sigma_JD矩陣,其中只包含這兩列:

import csv 
    import numpy as np 
    with open("C:/Users/.../03971822.csv") as input_file: 
     reader = csv.reader(input_file) 

     array = [] 
     for row in reader: 
     array.append(row) 

    matrix = np.asmatrix(array) 
    idx_IN_columns = [0, 5] 
    sigma_JD = matrix[:, idx_IN_columns] 
    print(sigma_JD) 
    print("size sigma_JD: ", np.shape(sigma_JD)) 

    >>> print(sigma_JD) 
    [['-12.42' '2451544.576'] 
    ['-12.92' '2451544.576'] 
    ['-12.45' '2451544.576'] 
    ..., 
    ['-11.66' '2454688.389'] 
    ['-12.61' '2454688.389'] 
    ['-11.72' '2454688.389']] 
    >>> print("size sigma_JD: ", np.shape(sigma_JD)) 
    size sigma_JD: (173828, 2) 

現在我想遍歷第二列 - 日期;它是在一個特定的方式顯示,這就是所謂的「儒略日」,例如JD值

  2451544,5 = 01/January/2000 0:00 
      2451545,5 = 02/January/2000 0:00 
      2451546,5 = 03/January/2000 0:00 

的2451544講述了日/月/年,小數位報時。

我想編寫一個代碼,其中考慮了所有sigma_0值,這些值都在一天之內。所以,循環應該使用特定的值,而不是通過索引。

它應該從2451544,5開始,然後考慮所有在一天之內的sigma_0值(並將其總結),然後轉到第二天2451544,5並執行相同的操作。 。

我試過s.th.這樣,但它不工作

x = 2451544.5 
    y = x + 1 
    for i in sigma_JD[:, 1]: 
     while x < y: 
    print(sigma_JD[i, 1]) 
    break 

然後我想到了創建我自己的功能,但沒得這麼遠:

def select(x): 
    count = 2451544.5 
    select = [] 
    for i in range(0, len(x[:, 1])): # loop over Julian Day 
     if count < count + 1: 
     row = [] 
     for j in range(0, len(x[:, 0])): # loop over sigma_0 values 
      # take all sigma_0 values and sum it up 
     count += 1 
    return select 

這將是非常,非常好的,如果有人可以幫我。我在這方面工作了好幾天,真的讓我感到很難過,我不知道該怎麼做。

非常感謝。

+1

你可以考慮使用對大熊貓這個任務。它在底層使用numpy,但它允許您讀取csv,將datetime列轉換爲日期,並提供簡單的使用groupby函數。 http://pandas.pydata.org/pandas-docs/stable/index.html –

回答

0

這給了一槍(你可能需要下載jdcal package)進行測試

import csv 
import collections 
from jdcal import jd2gcal 

with open("test.csv") as input_file: 
    reader = csv.reader(input_file) 

    jd_sigma_map = collections.defaultdict(int) 
    jd_sigma_count = collections.defaultdict(int) 

    for row in reader: 

     #convert to the normal date format 
     year, month, dd, ms = jd2gcal(float(row[5]), 0) 

     #use date as key 
     date_key = '%s-%s-%s' % (year, month, dd) 

     #Sum sigma values for same key (day) 
     jd_sigma_map[date_key] += float(row[0]) 
     jd_sigma_count[date_key] += 1 

文件(test.csv):

-12.42, 0, 0, 0, 0, 2451544.576 
-12.92, 0, 0, 0, 0, 2451544.576 
-5.92, 0, 0, 0, 0, 2451545.677 
-2.92, 0, 0, 0, 0, 2451545.699 
-16.61, 0, 0, 0, 0, 2454688.310 
-11.66, 0, 0, 0, 0, 2454688.389 
-12.61, 0, 0, 0, 0, 2454688.400 

輸出:

#For ordered (by date) output 
ordered_dict = collections.OrderedDict(sorted(jd_sigma_map.items())) 

for k, v in ordered_dict.items(): 
    average = float(v/jd_sigma_count[k]) 
    print("Sigma value for day %s = %0.3f \t(over %d days)\tAverage = %0.3f" 
      % (k, v, jd_sigma_count[k], average)) 

# Sigma value for day 2000-1-1 = -25.340 (over 2 days) Average = -12.670 
# Sigma value for day 2000-1-2 = -8.840 (over 2 days) Average = -4.420 
# Sigma value for day 2008-8-9 = -40.880 (over 3 days) Average = -13.627 

注:

  • 使用字典可以讓我們爲每一天「保留」西格瑪值。使用2x2數組更容易。
  • 輸出jd_sigma_map是一個字典,其關鍵是格式爲YYYY-MM-DD的日期,其值爲當天的總西格瑪值。我們不關心格式,我們只想讓每天的每個關鍵點都是獨特
  • 正如您所看到的,我在閱讀CSV期間「即時」完成了所有分析,您可以或者將其存儲在列表中,並關閉分析後文件。
  • 的Python 3溶液(變化print()print ...items()iteritems()的Python 2.x的)
  • this question排序輸出字典(代碼加)
+0

Thx到目前爲止,代碼工作完美。我也將輸出保存到一個新文件中。有沒有一種方法可以查看一天內有多少個sigma_0值被考慮在內?因爲,實際上我需要每天的sigma_0值的平均值(而不僅僅是總和)。 – user7448207

+0

不用擔心,很高興我能幫上忙!我已根據要求更新了答案 - 這是解決問題的簡單方法。不幸的是,我無法想到一個利用現有數據結構的「整潔」解決方案(例如,將'_map'字典更改爲具有元組值'(value,count)') –

+0

再次感謝您的幫助。在整個字典開始之前,我正在擺弄查詢的想法。例如,我有第七列距離值(從0 - 20 000),我首先讓用戶回答問題[「距離=輸入(」請輸入距離/半徑:「],因此, sigma_0的值將被累計和平均值,這是可能的嗎? – user7448207

0
import numpy as np 

array = [['-12.42', '2451544.576'], 
    ['-12.92', '2451544.576'], 
    ['-12.45', '2451544.576'], 
    ['-11.66', '2454688.389'], 
    ['-12.61', '2454688.389'], 
    ['-11.72', '2454688.389']] 


matrix = np.asmatrix(array) 
print matrix 
for (i, j), ele in np.ndenumerate(matrix): 
    if j == 1: #SECOND COL 
     print i, j, ele