0

多次元配列を同時にスライスして反復しようとしています。私は機能的な解決策を持っていますが、それはちょっと醜いです。私が知らない反復とスライスを行うための巧妙な方法があるに違いありません。コードは次のとおりです。

import numpy as np
x = np.arange(64).reshape(4,4,4)
y = [x[i:i+2,j:j+2,k:k+2] for i in range(0,4,2) 
                          for j in range(0,4,2) 
                          for k in range(0,4,2)]
y = np.array(y)
z = np.array([np.min(u) for u in y]).reshape(y.shape[1:])
4

2 に答える 2

4

y形状が定義されていないため、最後の形状変更は機能しません。それがなければ、次のようになります。

>>> x = np.arange(64).reshape(4,4,4)
>>> y = [x[i:i+2,j:j+2,k:k+2] for i in range(0,4,2) 
...                           for j in range(0,4,2) 
...                           for k in range(0,4,2)]
>>> z = np.array([np.min(u) for u in y])
>>> z
array([ 0,  2,  8, 10, 32, 34, 40, 42])

しかし、それにもかかわらず、おそらく必要なのは、配列を6次元に再形成することです。これにより、上記と同じ結果が得られます。

>>> xx = x.reshape(2, 2, 2, 2, 2, 2)
>>> zz = xx.min(axis=-1).min(axis=-2).min(axis=-3)
>>> zz
array([[[ 0,  2],
        [ 8, 10]],

       [[32, 34],
        [40, 42]]])
>>> zz.ravel()
array([ 0,  2,  8, 10, 32, 34, 40, 42])
于 2013-03-06T19:18:55.953 に答える
0

最後の意味で何が必要かを正確に伝えるのは難しいですが、stride_tricks を使用して「よりスマートな」方法を得ることができます。それはかなりトリッキーです。

import numpy.lib.stride_tricks

# This returns a view with custom strides, x2[i,j,k] matches y[4*i+2*j+k]
x2 = numpy.lib.stride_tricks(
        x, shape=(2,2,2,2,2,2),
        strides=(numpy.array([32,8,2,16,4,1])*x.dtype.itemsize))

z2 = z2.min(axis=-1).min(axis=-2).min(axis=-3)

それでも、これがはるかに読みやすいとは言えません。(または、各 min 呼び出しが一時的に行われるため、効率的です。)

y の要素を一致させようとしたため、私の答えはハイメの答えとは異なることに注意してください。minを に置き換えるとわかりますmax

于 2013-03-06T19:25:28.100 に答える