Numpy配列の列を反復する方法は?


109

mxn配列があるとします。この配列の各列を関数に渡して、列全体に対して何らかの操作を実行したいと思います。配列の列をどのように反復しますか?

例えば、私は4 x 3の配列を持っています

1  99 2
2  14 5
3  12 7
4  43 1

for column in array:
  some_function(column)

ここで、列は最初の反復で「1,2,3,4」、2番目の反復で「99,14,12,43」、3番目の反復で「2,5,7,1」になります。


2
あなたは、インデックス---使用することはできませんstackoverflow.com/questions/4455076/...
EV-BR

回答:


225

配列の転置を繰り返すだけです:

for column in array.T:
   some_function(column)

6
結果を単一の配列に戻す良い方法は何でしょうか?
Ibrahim Muhammad

46
不思議に思う人array.Tにとって、それは 'ストライド'を変えるだけなので、コストはかかりませんarray(興味深い議論についてはこの回答を参照してください)
drevicko '22

19

これはあなたにスタートを与えるでしょう

>>> for col in range(arr.shape[1]):
    some_function(arr[:,col])


[1 2 3 4]
[99 14 12 43]
[2 5 7 1]

7
それは私にはpythonicに見えません。
gronostaj 2014

@gronostajもちろんPythonicです。多次元配列の任意の軸を反復処理する場合、この問題を他にどのように解決しますか?
Neil G

1
@NeilGこの質問は、厳密に2次元配列についてです。
gronostaj 2018年

6

3次元配列の場合、次のことを試すことができます。

for c in array.transpose(1, 0, 2):
    do_stuff(c)

仕組みについてはドキュメントをご覧くださいarray.transpose。基本的には、シフトする次元を指定します。この場合、2番目のディメンション(列など)を最初のディメンションにシフトします。



4

unzipを使用して列を反復することもできます

for col in zip(*array):
   some_function(col)

2

たとえば、行列の各列の平均を求めたいとします。次の行列を作成しましょう

mat2 = np.array([1,5,6,7,3,0,3,5,9,10,8,0], dtype=np.float64).reshape(3, 4)

平均の関数は

def my_mean(x):
    return sum(x)/len(x)

必要なことを行い、結果をコロンベクトル「結果」に格納するには

results = np.zeros(4)
for i in range(0, 4):
    mat2[:, i] = my_mean(mat2[:, i])

results = mat2[1,:]      

結果は次のとおりです:array([4.33333333、5.、5.66666667、4.])


0

または、を使用できますenumerate。列番号と列値も表示されます。

for num, column in enumerate(array.T):
    some_function(column) # column: Gives you the column value as asked in the question
    some_function(num) # num: Gives you the column number 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.