返回数组,包括输入整数的正/负范围

时间:2018-03-16 08:04:52

标签: python python-2.7 numpy

a = np.array(5)

result = np.array([a-2, a-1, a, a+1, a+2])

print result
array([3, 4, 5, 6, 7])

正确!

但是,如果没有手动编写+- 2 a-2, a-1, a, a+1, a+2

,最好的办法是什么

编辑:第二个问题:

a = np.array([5,16,27])
res = np.concatenate([a-2, a-1, a, a+1, a+2])
print res
array([ 3, 14, 25,  4, 15, 26,  5, 16, 27,  6, 17, 28,  7, 18, 29])

确定

但如何在不写+-

的情况下执行此操作

4 个答案:

答案 0 :(得分:1)

你有没有考虑过这种方法?

result = [a+i for i in range(-2,3)]

对于第二个问题,只需使用一个循环(使用我的方法)

a, result = np.array([5,6,7]), []
for k in a: result.append([k+i for i in range(-2,3)])

results = [k+i for k in a for i in range(-2,3)]

答案 1 :(得分:1)

也许arange

np.transpose([np.arange(n-2, n+3) for n in a]).flatten()
#=> array([ 3, 14, 25,  4, 15, 26,  5, 16, 27,  6, 17, 28,  7, 18, 29])

请注意,我必须使用+ 3作为上限,因为参数指定了半开区间。

更新更新问题的一种可能解决方案:

def ranges(a, x):
  return np.transpose([np.arange(n-x, n+x+1) for n in a]).flatten()

作为一项功能:

{{1}}

答案 2 :(得分:1)

由于您使用numpy,请利用其矢量化。

您还可以将逻辑包装在函数中以使其适应性。

问题1

a = np.array(5)

def ranger(a, n):
    return np.arange(a-n, a+n+1)

ranger(a, 2)  # array([3, 4, 5, 6, 7])

问题2

a = np.array([5, 16, 27])

def ranger(a, n):
    return np.hstack([a+i for i in range(-n, n+1)])

ranger(a, 2)  # array([ 3, 14, 25,  4, 15, 26,  5, 16, 27,  6, 17, 28,  7, 18, 29])

答案 3 :(得分:0)

怎么样:

>>> import numpy as np
>>> np.add.outer(np.r_[-2:3], [5,16,27]).ravel()
array([ 3, 14, 25,  4, 15, 26,  5, 16, 27,  6, 17, 28,  7, 18, 29])