首页 > 解决方案 > 将范围应用于数组

问题描述

np.arange接受三个参数:start、stop 和 step。

我想要的步骤是-0.3048。我也有单独的数组用于启动和停止。

首先,我有一个完整的元素数组:

array([5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 4.377, 5.000,
       5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 3.462, 3.285,
       5.000, 5.000, 4.150, 5.000, 5.000, 5.000, 5.000, 5.000, 4.118, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 3.674, 5.000, 5.000, 5.000, 5.000,
       5.000, 5.000, 4.655, 5.000, 5.000, 5.000, 4.573, 5.000, 5.000, 4.775, 4.909, 5.000, 5.000, 5.000, 3.874, 5.000, 5.000, 3.197, 5.000, 5.000,
       5.000, 5.000, 5.000, 4.829, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 4.372, 4.175, 5.000, 5.000, 5.000, 5.000,
       5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 4.793, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 4.993, 5.000, 5.000, 5.000, 5.000, 5.000,
       5.000, 4.898, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 4.294, 5.000])

以下是相应的停止值:

array([1.927, -0.018, 0.214, 4.390, 0.162, 3.790, 4.891, -0.011, 4.623, 1.203, 4.270, 3.239, 4.569, 0.001, 3.942, 4.363, 3.135, 4.390, 3.176, 4.390,
       3.958, 3.992, 0.595, 4.458, 4.897, -0.009, -0.004, 0.004, 0.010, 4.987, 4.454, 3.167, 3.791, 4.213, 3.100, 4.312, 4.166, 3.942, 1.984, 2.077,
       4.810, 0.737, 0.490, 3.167, -0.010, 0.214, 4.313, 3.607, 2.509, 2.801, 3.034, 3.257, 0.013, 4.398, 0.013, 2.509, 4.157, 4.365, 4.902, 2.109,
       4.390, 3.176, 3.034, 4.096, 0.168, 3.205, 3.176, 1.927, 4.352, 2.509, 2.848, 4.749, 4.217, 3.017, 2.509, 4.204, 0.268, 1.662, 4.124, 0.136,
       2.509, 1.623, 4.791, 0.028, 2.969, 4.770, 4.799, 3.167, 2.970, 4.301, 0.883, 4.314, 0.182, -0.051, 2.493, 2.509, 4.131, 4.001, 4.952, 4.209,
       4.363, 4.632, 4.390, 3.172, 3.470, 0.174, 4.804, 2.247, 2.751, 4.352, 4.110, 2.969, 4.914, 2.142, 2.120, 4.936, 3.780, 3.942, 1.042, 4.229,
       2.267, 1.927, 1.213, 2.509, 4.464, 4.464, 0.595, 4.442, 2.751, 2.509, 3.339])

我需要对每个元素应用范围。

最快的方法是什么?我知道我可以使用 for 循环,但我希望有一个 numpy-native 解决方案(即矢量化)。

谢谢。如果有任何不清楚的地方,请告诉我。

标签: pythonnumpy

解决方案


如果您想即时创建它们,可以使用 for 循环:

starts = np.array([5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 4.377, 5.000,
   5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 3.462, 3.285,
   5.000, 5.000, 4.150, 5.000, 5.000, 5.000, 5.000, 5.000, 4.118, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 3.674, 5.000, 5.000, 5.000, 5.000,
   5.000, 5.000, 4.655, 5.000, 5.000, 5.000, 4.573, 5.000, 5.000, 4.775, 4.909, 5.000, 5.000, 5.000, 3.874, 5.000, 5.000, 3.197, 5.000, 5.000,
   5.000, 5.000, 5.000, 4.829, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 4.372, 4.175, 5.000, 5.000, 5.000, 5.000,
   5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 4.793, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 4.993, 5.000, 5.000, 5.000, 5.000, 5.000,
   5.000, 4.898, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 5.000, 4.294, 5.000])

stops = np.array([1.927, -0.018, 0.214, 4.390, 0.162, 3.790, 4.891, -0.011, 4.623, 1.203, 4.270, 3.239, 4.569, 0.001, 3.942, 4.363, 3.135, 4.390, 3.176, 4.390,
   3.958, 3.992, 0.595, 4.458, 4.897, -0.009, -0.004, 0.004, 0.010, 4.987, 4.454, 3.167, 3.791, 4.213, 3.100, 4.312, 4.166, 3.942, 1.984, 2.077,
   4.810, 0.737, 0.490, 3.167, -0.010, 0.214, 4.313, 3.607, 2.509, 2.801, 3.034, 3.257, 0.013, 4.398, 0.013, 2.509, 4.157, 4.365, 4.902, 2.109,
   4.390, 3.176, 3.034, 4.096, 0.168, 3.205, 3.176, 1.927, 4.352, 2.509, 2.848, 4.749, 4.217, 3.017, 2.509, 4.204, 0.268, 1.662, 4.124, 0.136,
   2.509, 1.623, 4.791, 0.028, 2.969, 4.770, 4.799, 3.167, 2.970, 4.301, 0.883, 4.314, 0.182, -0.051, 2.493, 2.509, 4.131, 4.001, 4.952, 4.209,
   4.363, 4.632, 4.390, 3.172, 3.470, 0.174, 4.804, 2.247, 2.751, 4.352, 4.110, 2.969, 4.914, 2.142, 2.120, 4.936, 3.780, 3.942, 1.042, 4.229,
   2.267, 1.927, 1.213, 2.509, 4.464, 4.464, 0.595, 4.442, 2.751, 2.509, 3.339])

step = -0.3048
if len(starts)!=len(stops):
    raise IndexError("Shape of starts does not match shape of stops")

for i in range(len(starts)):
    myrange = np.arange(starts[i], stops[i], step)
    # do things

变得更花哨:

pairs = list(zip(starts, stops))

for start, stop in pairs:
    myrange = np.arange(start, stop, step)

我确信有一个更好的numpy-native 实现,但这可以让你起步


推荐阅读