所以,我想对我的3d数组进行切片,跳过前两个数组,然后返回下两个数组。我希望切片保持这种模式,交替跳过2个数组和给出2个数组等。我已经找到了一个解决方案,但我想知道是否有一个更优雅的方法来实现这一点?最好是不必重新整形?
arr = np.arange(1, 251).reshape((10, 5, 5)) sliced_array = np.concatenate((arr[2::4], arr[3::4]), axis=1).ravel().reshape((4, 5, 5))
h79rfbju1#
您可以使用重复[False, False, True, True, ...]的掩码进行布尔索引:
[False, False, True, True, ...]
import numpy as np arr = np.arange(1, 251).reshape((10, 5, 5)) mask = np.arange(arr.shape[0]) % 4 >= 2 out = arr[mask]
输出:
array([[[ 51, 52, 53, 54, 55], [ 56, 57, 58, 59, 60], [ 61, 62, 63, 64, 65], [ 66, 67, 68, 69, 70], [ 71, 72, 73, 74, 75]], [[ 76, 77, 78, 79, 80], [ 81, 82, 83, 84, 85], [ 86, 87, 88, 89, 90], [ 91, 92, 93, 94, 95], [ 96, 97, 98, 99, 100]], [[151, 152, 153, 154, 155], [156, 157, 158, 159, 160], [161, 162, 163, 164, 165], [166, 167, 168, 169, 170], [171, 172, 173, 174, 175]], [[176, 177, 178, 179, 180], [181, 182, 183, 184, 185], [186, 187, 188, 189, 190], [191, 192, 193, 194, 195], [196, 197, 198, 199, 200]]])
wfsdck302#
由于您希望选择并跳过相同的数字,因此整形可以起作用。对于一维阵列:
In [97]: np.arange(10).reshape(5,2)[1::2] Out[97]: array([[2, 3], [6, 7]])
然后可将其拆散。泛化到更多维度:
In [98]: x = np.arange(100).reshape(10,10) In [99]: x.reshape(5,2,10)[1::2,...].reshape(-1,10) Out[99]: array([[20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39], [60, 61, 62, 63, 64, 65, 66, 67, 68, 69], [70, 71, 72, 73, 74, 75, 76, 77, 78, 79]])
我不会继续3d,因为显示器会更长,但它应该是直向前的。
2条答案
按热度按时间h79rfbju1#
您可以使用重复
[False, False, True, True, ...]
的掩码进行布尔索引:输出:
wfsdck302#
由于您希望选择并跳过相同的数字,因此整形可以起作用。
对于一维阵列:
然后可将其拆散。
泛化到更多维度:
我不会继续3d,因为显示器会更长,但它应该是直向前的。