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)

不过,我不能说这更具可读性。(或高效,因为每个最小调用都会临时。)

请注意,我的答案与Jaime 的不同,因为我试图匹配您的 y 元素。您可以判断是否将 替换minmax

于 2013-03-06T19:25:28.100 回答