是否有一种方法来变量切片numpy?



我正试图以变量的方式切片数组。例如,从第0行到第10行,使用步骤2对数组进行切片。从第10行到第30行,使用3的步长对其进行切片。

同样,值得一提的是,我试图在不编写任何循环的情况下这样做。

到目前为止,我尝试了以下方法:

>>> x = np.arange(64*128).reshape(128,64)
>>> x[np.s_[0:10:2, 10:30:3], :]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

我想要的输出:

>>> x = np.arange(64*128).reshape(128,64)
>>> x[np.s_[0:10:2, 10:30:3], :]
array([[   0,  128,  256,  384,  512,  640,  768,  896, 1024, 1152, 1280,
1408, 1536, 1664, 1792, 1920, 2048, 2176, 2304, 2432, 2560, 2688,
2816, 2944, 3072, 3200, 3328, 3456, 3584, 3712, 3840, 3968, 4096,
4224, 4352, 4480, 4608, 4736, 4864, 4992, 5120, 5248, 5376, 5504,
5632, 5760, 5888, 6016, 6144, 6272, 6400, 6528, 6656, 6784, 6912,
7040, 7168, 7296, 7424, 7552, 7680, 7808, 7936, 8064],
[   2,  130,  258,  386,  514,  642,  770,  898, 1026, 1154, 1282,
1410, 1538, 1666, 1794, 1922, 2050, 2178, 2306, 2434, 2562, 2690,
2818, 2946, 3074, 3202, 3330, 3458, 3586, 3714, 3842, 3970, 4098,
4226, 4354, 4482, 4610, 4738, 4866, 4994, 5122, 5250, 5378, 5506,
5634, 5762, 5890, 6018, 6146, 6274, 6402, 6530, 6658, 6786, 6914,
7042, 7170, 7298, 7426, 7554, 7682, 7810, 7938, 8066],
[   4,  132,  260,  388,  516,  644,  772,  900, 1028, 1156, 1284,
1412, 1540, 1668, 1796, 1924, 2052, 2180, 2308, 2436, 2564, 2692,
2820, 2948, 3076, 3204, 3332, 3460, 3588, 3716, 3844, 3972, 4100,
4228, 4356, 4484, 4612, 4740, 4868, 4996, 5124, 5252, 5380, 5508,
5636, 5764, 5892, 6020, 6148, 6276, 6404, 6532, 6660, 6788, 6916,
7044, 7172, 7300, 7428, 7556, 7684, 7812, 7940, 8068],
[   6,  134,  262,  390,  518,  646,  774,  902, 1030, 1158, 1286,
1414, 1542, 1670, 1798, 1926, 2054, 2182, 2310, 2438, 2566, 2694,
2822, 2950, 3078, 3206, 3334, 3462, 3590, 3718, 3846, 3974, 4102,
4230, 4358, 4486, 4614, 4742, 4870, 4998, 5126, 5254, 5382, 5510,
5638, 5766, 5894, 6022, 6150, 6278, 6406, 6534, 6662, 6790, 6918,
7046, 7174, 7302, 7430, 7558, 7686, 7814, 7942, 8070],
[   8,  136,  264,  392,  520,  648,  776,  904, 1032, 1160, 1288,
1416, 1544, 1672, 1800, 1928, 2056, 2184, 2312, 2440, 2568, 2696,
2824, 2952, 3080, 3208, 3336, 3464, 3592, 3720, 3848, 3976, 4104,
4232, 4360, 4488, 4616, 4744, 4872, 5000, 5128, 5256, 5384, 5512,
5640, 5768, 5896, 6024, 6152, 6280, 6408, 6536, 6664, 6792, 6920,
7048, 7176, 7304, 7432, 7560, 7688, 7816, 7944, 8072],
[  10,  138,  266,  394,  522,  650,  778,  906, 1034, 1162, 1290,
1418, 1546, 1674, 1802, 1930, 2058, 2186, 2314, 2442, 2570, 2698,
2826, 2954, 3082, 3210, 3338, 3466, 3594, 3722, 3850, 3978, 4106,
4234, 4362, 4490, 4618, 4746, 4874, 5002, 5130, 5258, 5386, 5514,
5642, 5770, 5898, 6026, 6154, 6282, 6410, 6538, 6666, 6794, 6922,
7050, 7178, 7306, 7434, 7562, 7690, 7818, 7946, 8074],
[  13,  141,  269,  397,  525,  653,  781,  909, 1037, 1165, 1293,
1421, 1549, 1677, 1805, 1933, 2061, 2189, 2317, 2445, 2573, 2701,
2829, 2957, 3085, 3213, 3341, 3469, 3597, 3725, 3853, 3981, 4109,
4237, 4365, 4493, 4621, 4749, 4877, 5005, 5133, 5261, 5389, 5517,
5645, 5773, 5901, 6029, 6157, 6285, 6413, 6541, 6669, 6797, 6925,
7053, 7181, 7309, 7437, 7565, 7693, 7821, 7949, 8077],
[  16,  144,  272,  400,  528,  656,  784,  912, 1040, 1168, 1296,
1424, 1552, 1680, 1808, 1936, 2064, 2192, 2320, 2448, 2576, 2704,
2832, 2960, 3088, 3216, 3344, 3472, 3600, 3728, 3856, 3984, 4112,
4240, 4368, 4496, 4624, 4752, 4880, 5008, 5136, 5264, 5392, 5520,
5648, 5776, 5904, 6032, 6160, 6288, 6416, 6544, 6672, 6800, 6928,
7056, 7184, 7312, 7440, 7568, 7696, 7824, 7952, 8080],
[  19,  147,  275,  403,  531,  659,  787,  915, 1043, 1171, 1299,
1427, 1555, 1683, 1811, 1939, 2067, 2195, 2323, 2451, 2579, 2707,
2835, 2963, 3091, 3219, 3347, 3475, 3603, 3731, 3859, 3987, 4115,
4243, 4371, 4499, 4627, 4755, 4883, 5011, 5139, 5267, 5395, 5523,
5651, 5779, 5907, 6035, 6163, 6291, 6419, 6547, 6675, 6803, 6931,
7059, 7187, 7315, 7443, 7571, 7699, 7827, 7955, 8083],
[  22,  150,  278,  406,  534,  662,  790,  918, 1046, 1174, 1302,
1430, 1558, 1686, 1814, 1942, 2070, 2198, 2326, 2454, 2582, 2710,
2838, 2966, 3094, 3222, 3350, 3478, 3606, 3734, 3862, 3990, 4118,
4246, 4374, 4502, 4630, 4758, 4886, 5014, 5142, 5270, 5398, 5526,
5654, 5782, 5910, 6038, 6166, 6294, 6422, 6550, 6678, 6806, 6934,
7062, 7190, 7318, 7446, 7574, 7702, 7830, 7958, 8086],
[  25,  153,  281,  409,  537,  665,  793,  921, 1049, 1177, 1305,
1433, 1561, 1689, 1817, 1945, 2073, 2201, 2329, 2457, 2585, 2713,
2841, 2969, 3097, 3225, 3353, 3481, 3609, 3737, 3865, 3993, 4121,
4249, 4377, 4505, 4633, 4761, 4889, 5017, 5145, 5273, 5401, 5529,
5657, 5785, 5913, 6041, 6169, 6297, 6425, 6553, 6681, 6809, 6937,
7065, 7193, 7321, 7449, 7577, 7705, 7833, 7961, 8089],
[  28,  156,  284,  412,  540,  668,  796,  924, 1052, 1180, 1308,
1436, 1564, 1692, 1820, 1948, 2076, 2204, 2332, 2460, 2588, 2716,
2844, 2972, 3100, 3228, 3356, 3484, 3612, 3740, 3868, 3996, 4124,
4252, 4380, 4508, 4636, 4764, 4892, 5020, 5148, 5276, 5404, 5532,
5660, 5788, 5916, 6044, 6172, 6300, 6428, 6556, 6684, 6812, 6940,
7068, 7196, 7324, 7452, 7580, 7708, 7836, 7964, 8092]])

正如评论中指出的,每个维度只能应用单个切片。但你也可以分别应用这两个切片,然后将数组的各个部分连接起来,如下所示:

x = np.arange(64*128).reshape(64, 128).transpose()
np.concatenate([x[s] for s in np.s_[0:10:2, 10:30:3]])

为了得到您想要的确切输出,我必须稍微不同地创建x数组。

最新更新