我正在尝试同时切片和遍历多维数组。我有一个功能性的解决方案,但它有点难看,而且我打赌有一种灵活的方式可以进行我不知道的迭代和切片。这是代码:
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:])
答案 0 :(得分: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])
答案 1 :(得分: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's不同,因为我试图匹配你的y元素。您可以判断是否将min
替换为max
。