2016-09-16 12 views
0

私は緯度/経度値の数が少ない配列で動作する関数を作成しました。私は関数は緯度/経度のための新しい配列を返すされていなくても、配列は変更regrid2私の緯度/経度を呼び出すPython関数は渡されない変数を再定義します

from __future__ import division, print_function 

import pandas as pd, numpy as np 


def regrid2(lats, lons, lat_res=0.25, lon_res=0.25): 

    # round lat/lon values to nearest decimal degree according to specified 
    # resolution and reshape the array 
    lats[lats<=0] = lat_res*(np.round(lats[lats<=0]/lat_res)) - lat_res/2 
    lats[lats>0] = lat_res*(np.round(lats[lats>0]/lat_res)) + lat_res/2 

    lons[lons<=0] = lon_res*(np.round(lons[lons<=0]/lon_res)) + lon_res/2 
    lons[lons>0] = lon_res*(np.round(lons[lons>0]/lon_res)) - lon_res/2 

    lats = np.reshape(lats, (lats.size,1), order='F') 
    lons = np.reshape(lons, (lons.size,1), order='F') 

    lats = 0 

    df = pd.DataFrame() 
    return df 


lat = np.arange(80.111, 90, 5) 
lon = np.arange(170.11, 180,0.33) 

df = regrid2(lat,lon) 

。 REGRIDを呼び出した後

>>> lat.min() 
    80.111000000000004 
>>> lon.min() 
    170.11000000000001 

>>> lat.min() 
    80.125 
>>> lon.min() 
    169.875 

私は以前にも同様の問題を抱えて覚えていませんREGRIDを呼び出す前に

例えば、。これは特に奇妙なことですが、問題なく昨夜同じスクリプトを実行しましたが、今朝は関数が緯度/経度変数を再定義しています。 IDEを再起動しましたが、なぜこれが起きているのか判断できませんでした。

私はlat/lonをregridにコピーすると問題はないと言われています。例えば

df = regrid2(lat.copy(),lon.copy()) 
>>> lat.min() 
    80.111000000000004 
>>> lon.min() 
    170.11000000000001 

突然の動作の変化を確認したいと思います。私は通常、パンダでは最近、numpyではないので、多分行動に変化はなく、むしろ私はこれに気づいている。

は、Python 2.7、numpyの1.10.4

+0

あなたのコードは正しく表示されない 'df = pdf.pdf() return df'はあなたの作業コードと同じですか? – EdChum

+5

変更可能な値を関数に渡してから、それを変更しています。ナンシー配列は常にこのように変更可能です。 – kojiro

+2

あなたのタイトルが誤解を招く場合は、変数 'lat'と' lon'が確実に渡されます。 – IanS

答えて

1

は、あなたはそれを変異、機能に変更可能なデータを渡しています。

あなたは

def regrid2(lats, lons, lat_res=0.25, lon_res=0.25): 
    lats, lons = np.copy(lats), np.copy(lons) 

ではなくコピーで作業するために使用することができますか?

+0

それは私が疑ったものです。明確化のためにありがとう。私は常に関数を自動的にコピーを作成し、実際に参照された変数に触れることはないと考えました。これは正常なことかもしれませんが、私はこれがまだ異常な動作のように聞こえることを認めなければなりません。 – tnknepp

関連する問題