Pythonのメモ帳

numpy, pandas, tensorflow を使いこなすための忘備録

要素が全てnanの配列を生成をする

 最近書くpythonコードの半分以上はnumpy.ndarrayを使ってる。

numpyがなかったら仕事にならない。それくらいお世話になってる。ただ一つだけ不満というか疑問に思っているのが要素が全てnanの配列を生成をする関数がないこと。要素が全て0の配列を生成する関数 numpy.zeros() があるならnumpy.nans() があってもいいと思うけど、なぜかない。何か理由があるんだろうか。

まあとにかく、そういう関数はないので自前で作るわけで、いつも下のようなやり方をしてる。

import numpy as np
mat = np.zeros([ysize,xsize])
mat[:,:] = np.nan

 

zeros()を使って狙いのサイズの配列を作成したのちに、全要素をnanにする、という処理を行う。(本当はempty()を使った方が計算コストが低いらしいけど)

作りたい配列と同じサイズの配列があったりする場合は、zeros_like() も便利。同じサイズで要素が全て0の配列を作ってくれる。 

mat = np.zeros_like(mat_original)
mat[:,:] = np.nan

 

でもやっぱりnumpy.nans()が欲しい。

 

 

 WEB/EC専門の転職支援サービス【サポタント】

 

 

nan を含む配列の要素をシフトする

配列の要素をシフトさせる関数 shift() のことを前回書いたけど、この関数は配列内の要素にnanが含まれると使えない(出力する配列の要素が全てnanになる)という欠点がある。そして残念ながら今書いてるスクリプトでは配列にnanが入るので、結局自分でコードを書いた。

 前回記事はこちら。

spcx8.hatenablog.com

 

まずは1次元配列をシフトさせるコード。

import numpy as np

def shift_1darray(mat, ys):
    mat_shift = np.zeros_like(mat)
    mat_shift[:,:] = np.nan
    if   ys>0: mat_shift[ys:] = mat[:-ys]
    elif ys<0: mat_shift[:ys] = mat[-ys:]
    else: mat_shift = mat
    return mat_shift

 それから2次元配列をシフトさせるコード。

import numpy as np

def shift_2darray(mat, ys, xs):
    mat_yshift = np.zeros_like(mat)
    mat_yshift[:,:] = np.nan
    if   ys>0: mat_yshift[ys:  ,:] = mat[   :-ys,:]
    elif ys<0: mat_yshift[  :ys,:] = mat[-ys:   ,:]
    else: mat_yshift = mat

    mat_xshift = np.zeros_like(mat)
    mat_xshift[:,:] = np.nan
    if   ys>0: mat_xshift[:,xs:  ] = mat_yshift[:,   :-xs]
    elif ys<0: mat_xshift[:,  :xs] = mat_yshift[:,-xs:   ]
    else: mat_xshift = mat_yshift
    return mat_xshift

 

もっと簡単にできるよ、という方いたらぜひ教えてください。行数減らしたいです。

 

 

 

2次元配列をシフトさせる

pythonで配列をシフトさせたくて調べてみた。 

自分でコード書いてもできるけど、pythonのことだからぴったりの関数があるんじゃないかと思って探していたら、scipy の shift() という関数を見つけた。

import numpy as np 
from scipy.ndimage.interpolation import shift
xs
= np.array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
shift
(xs, 3, cval=np.NaN)

stackoverflow.com

上の例のように配列を右に3つシフトさせると出力はこうなる。

出力: [ nan, nan, nan, 0., 1., 2., 3., 4., 5., 6.]

 

逆向きに左にシフトさせる場合は、マイナスを使う。

shift(xs, -3, cval=np.NaN)
出力:[ 3., 4., 5., 6., 7., 8., 9., nan, nan, nan]

 

結果は省略するけど、この関数は2次元配列にも使える。
下のようにシフト量をリストで表記すればいい。

shift(xs, [-3, 1], cval=np.NaN)

 

試してないけど3次元以降も使えるのかも。

ちなみに、配列内に nan が含まれる場合は、shift()は使えないみたい。
配列の中身が全てnanになってしまう。ちょっと惜しい。

  

 

 WEB/EC専門の転職支援サービス【サポタント】