2016-10-05 18 views
2

で、このコードは動作します反復は、例えば、変数の列

import numpy as np 
import numpy.random as rnd 

a = rnd.randint(0,10,(10,10)) 
k = (1,2) 
b = a[:,k] 

for col in np.arange(np.size(b,1)): 
    b[:,col] = b[:,col]+col*100 

このおもちゃコードのは、考えてみましょう、 aから抽出された部分行列が行ベクトルに変換され、 forループの関数を適用するとエラーが発生します。列ベクトルを得るために

if np.dim(b) == 1: 
    b = np.reshape(b, (np.size(b), 1)) 

が、これは高価です:もちろん 、私はbの大きさをチェックし、再形成することにより、これを修正することができます。

質問:この状況を処理する最善の方法は何ですか? これはかなり頻繁に起きるようなものだと思うし、それに対処する最良の戦略は何か疑問だ。

+2

「b.shape =(np.size(b)、1)」を使用すると、データの中間コピーや再割当てを行わずに済むため、再構成は安価です。 – Julien

答えて

0

あなたはリストやタプルとインデックス、2Dの形状が保持されている場合:

In [638]: a=np.random.randint(0,10,(10,10)) 
In [639]: a[:,(1,2)].shape 
Out[639]: (10, 2) 
In [640]: a[:,(1,)].shape 
Out[640]: (10, 1) 

そして私はb繰り返しがに単純化することができると思う:計算のこの種もなります

a[:,k] += np.arange(len(k))*100 

kは常にリストまたはタプルであり、決してスカラーではありません(スカラーにはlenはありません)。

np.column_stackは、その入力は、2D(及びない場合の端部に拡大)であり保証:

if arr.ndim < 2: 
    arr = array(arr, copy=False, subok=True, ndmin=2).T 

np.atleast_2dはもちろん

if b.ndim==1: 
    b = b[:,None] 
この場合に変更可能性

elif len(ary.shape) == 1: 
    result = ary[newaxis,:] 

を行います

どのような方法でも、私はそれがkは、後でbの形状を調整するのではなく、タプルです。しかし、両方のオプションをツールボックスに入れておきます。